Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Android utility class for checking device's network connectivity and speed.
package com.emil.android.util;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.TelephonyManager;
/**
* Check device's network connectivity and speed
* @author emil http://stackoverflow.com/users/220710/emil
*
*/
public class Connectivity {
/**
* Get the network info
* @param context
* @return
*/
public static NetworkInfo getNetworkInfo(Context context){
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getActiveNetworkInfo();
}
/**
* Check if there is any connectivity
* @param context
* @return
*/
public static boolean isConnected(Context context){
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected());
}
/**
* Check if there is any connectivity to a Wifi network
* @param context
* @param type
* @return
*/
public static boolean isConnectedWifi(Context context){
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI);
}
/**
* Check if there is any connectivity to a mobile network
* @param context
* @param type
* @return
*/
public static boolean isConnectedMobile(Context context){
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_MOBILE);
}
/**
* Check if there is fast connectivity
* @param context
* @return
*/
public static boolean isConnectedFast(Context context){
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected() && Connectivity.isConnectionFast(info.getType(),info.getSubtype()));
}
/**
* Check if the connection is fast
* @param type
* @param subType
* @return
*/
public static boolean isConnectionFast(int type, int subType){
if(type==ConnectivityManager.TYPE_WIFI){
return true;
}else if(type==ConnectivityManager.TYPE_MOBILE){
switch(subType){
case TelephonyManager.NETWORK_TYPE_1xRTT:
return false; // ~ 50-100 kbps
case TelephonyManager.NETWORK_TYPE_CDMA:
return false; // ~ 14-64 kbps
case TelephonyManager.NETWORK_TYPE_EDGE:
return false; // ~ 50-100 kbps
case TelephonyManager.NETWORK_TYPE_EVDO_0:
return true; // ~ 400-1000 kbps
case TelephonyManager.NETWORK_TYPE_EVDO_A:
return true; // ~ 600-1400 kbps
case TelephonyManager.NETWORK_TYPE_GPRS:
return false; // ~ 100 kbps
case TelephonyManager.NETWORK_TYPE_HSDPA:
return true; // ~ 2-14 Mbps
case TelephonyManager.NETWORK_TYPE_HSPA:
return true; // ~ 700-1700 kbps
case TelephonyManager.NETWORK_TYPE_HSUPA:
return true; // ~ 1-23 Mbps
case TelephonyManager.NETWORK_TYPE_UMTS:
return true; // ~ 400-7000 kbps
/*
* Above API level 7, make sure to set android:targetSdkVersion
* to appropriate level to use these
*/
case TelephonyManager.NETWORK_TYPE_EHRPD: // API level 11
return true; // ~ 1-2 Mbps
case TelephonyManager.NETWORK_TYPE_EVDO_B: // API level 9
return true; // ~ 5 Mbps
case TelephonyManager.NETWORK_TYPE_HSPAP: // API level 13
return true; // ~ 10-20 Mbps
case TelephonyManager.NETWORK_TYPE_IDEN: // API level 8
return false; // ~25 kbps
case TelephonyManager.NETWORK_TYPE_LTE: // API level 11
return true; // ~ 10+ Mbps
// Unknown
case TelephonyManager.NETWORK_TYPE_UNKNOWN:
default:
return false;
}
}else{
return false;
}
}
}

great!

Aracem commented Nov 18, 2013

Cool! :)

Antarix commented Nov 20, 2013

really cool!

Thanks!

thank you!

sirvon commented Aug 2, 2014

str8 fire!

Hi Emil, this is a very nice piece of code. We’d like to use it, but want to be sure to respect your copyright in the code. Would you be willing to provide it under a BSD license? Thank you so much! Stefan

Owner

emil2k commented Sep 15, 2014

@stefanesq I'm not familiar with the details of the BSD license so I will just put the code under the MIT License: http://opensource.org/licenses/MIT

Nicely done!

thx man!

Nice work ..... !

awesome ....!!

Really good but What if connected to a firewalled network or a wifi with no internet connectivity.

jpxiong commented Aug 3, 2015

Good. But sometimes the speed is not fast even through in wifi type. so it is inaccuracy in isConnectionFast() method.

Cool! Thank you!

Thank you mate!

Very useful, thank you!

Thank you. Useful!

Very useful, you saved my day, thanks.

edwinj84 commented Aug 7, 2016

Thanks!

Vishruit commented Sep 7, 2016

Thanks!

cool Thanks...

Awesome. Thanks!

Jammiel commented Jan 16, 2017

great thanks

thankss;

for wifi

AWESOME..Thank you :-)

Thank you very much 👍

Great!
Thank you

Thank you :)

salbiz commented Apr 29, 2017

How can I calculate the download speed when my app will mainly work on the mobile network. I am new to android dev . please help.

Awesome! :)

Baxtex commented Jun 7, 2017

Awesome, but it just shows the connection type, not the actual speed over the network.

thank you very much!

Hello, I am using isConnectionFast method by passing context. But when my mobile in 2G with 30kbps around, this method showing the subtype 2 (TelephonyManager.NETWORK_TYPE_EDGE) which is 50~100 kbps is wrong right?

Correct me if I am doing wrong.

Regards
Vinod

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment