Reputation: 573
I need to check if there is internet connection even if the phone is connected to a wifi network or 3G. I have this code but it says only if connected to a network:
public class ConnectionDetector {
private Context _context;
public ConnectionDetector(Context context){
this._context = context;
}
public boolean isConnectingToInternet(){
ConnectivityManager connectivity = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null)
{
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null)
for (int i = 0; i < info.length; i++)
if (info[i].getState() == NetworkInfo.State.CONNECTED)
{
return true;
}
}
return false;
}
}
Upvotes: 1
Views: 1439
Reputation: 28599
You say Check *internet* connection even if connected to wifi or 3G, however you implementation will not actually test this, as simply being connected to a WiFi network does not mean that you have internet connectivity. As a suggestion, you could attempt opening a socket to a known host - if the connection is successful, you can be sure that you have network access.
public boolean hasInternetConnectivity() {
try {
// connect to google on port 80, the HTTP port
Socket s = new Socket("www.google.com", 80);
// the above would have thrown if failed, so we are good
s.close();
return true;
} catch (Exception e) {
// check logcat to see why it failed, you could then catch and handle each exception independently ( time out, host unknown, end of stream, etc.. )
e.printStackTrace();
// the connection has failed, return false
return false;
}
Upvotes: 1
Reputation: 4877
I have created this class to get if the user is connected on the internet and what type of connection he has
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.TelephonyManager;
public class NetWork {
private static boolean connectionEstablished = false;
/**
* get the internet connection of the device
*
* @param context
* @return the type of internet connection
*/
private static NetWorkTypes getNetwork(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if (info == null || !info.isConnected())
return NetWorkTypes.NO_CONNECTION;
if (info.getType() == ConnectivityManager.TYPE_WIFI)
return NetWorkTypes.WIFI;
if (info.getType() == ConnectivityManager.TYPE_MOBILE) {
int networkType = info.getSubtype();
switch (networkType) {
case TelephonyManager.NETWORK_TYPE_GPRS:
case TelephonyManager.NETWORK_TYPE_EDGE:
case TelephonyManager.NETWORK_TYPE_CDMA:
case TelephonyManager.NETWORK_TYPE_1xRTT:
case TelephonyManager.NETWORK_TYPE_IDEN: // all above for 2G
case TelephonyManager.NETWORK_TYPE_UMTS:
case TelephonyManager.NETWORK_TYPE_EVDO_0:
case TelephonyManager.NETWORK_TYPE_EVDO_A:
case TelephonyManager.NETWORK_TYPE_HSDPA:
case TelephonyManager.NETWORK_TYPE_HSUPA:
case TelephonyManager.NETWORK_TYPE_HSPA:
case TelephonyManager.NETWORK_TYPE_EVDO_B:
case TelephonyManager.NETWORK_TYPE_EHRPD:
case TelephonyManager.NETWORK_TYPE_HSPAP: // all above for 3G
case TelephonyManager.NETWORK_TYPE_LTE: // 4G
return NetWorkTypes.MOBILE_NETWORK;
default:
return NetWorkTypes.UNKNOWN;
}
}
return NetWorkTypes.UNKNOWN;
}
/**
* check if device is connected on the internet
*
* @param context
* @return true if is connected, false if isn't
*/
public static boolean isConnected(Context context) {
NetWorkTypes netWorkType;
netWorkType = getNetwork(context);
if (netWorkType == NetWorkTypes.WIFI || netWorkType == NetWorkTypes.MOBILE_NETWORK) {
connectionEstablished = true;
} else {
connectionEstablished = false;
}
return connectionEstablished;
}
/**
* @return the boolean that tells if there is connection on the internet
*/
public static boolean getConnectionEstablished() {
return connectionEstablished;
}
}
NetWorkTypes
is just an enum. You can return anything else you wish
Upvotes: 0
Reputation: 2492
You can use the following to detect if either 3G or WiFi is connected
ConnectivityManager man = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
//3G
boolean is3gConnected = man.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnectedOrConnecting();
//Wifi
boolean isWifiConnected = man.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting();
Upvotes: 0