Last active
September 8, 2016 08:57
-
-
Save truongngoclinh/e940bd8afdb82dfd41ed8e953053a03a to your computer and use it in GitHub Desktop.
Fully check network condition in android
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class NetworkUtil { | |
private static Context sCtx; | |
public static void init(Context context) { | |
sCtx = context.getApplicationContext(); | |
} | |
public static Result check() { | |
return new Result(getNetworkInfo(sCtx)); | |
} | |
private static NetworkInfo getNetworkInfo(Context context) { | |
if (isDozing(context)) { | |
Log.d(TAG, "checkNetwork: isDozing"); | |
return null; | |
} | |
ConnectivityManager cm = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)); | |
if (cm == null) { | |
BBAppLogger.e("checkNetwork: ConnectivityManager is null !!!"); | |
return null; | |
} | |
NetworkInfo ni = cm.getActiveNetworkInfo(); | |
if (ni == null) { | |
BBAppLogger.e("checkNetwork: networkInfo is null"); | |
return null; | |
} | |
Log.d(TAG, "checkNetwork: state=%d type=%s connected=%s", ni.getState(), ni.getTypeName(), ni.isConnected()); | |
return ni; | |
} | |
/** | |
* Returns true if the device is in Doze/Idle mode. Should be called before checking the network connection because | |
* the ConnectionManager may falsely report the device is connected in Doze mode. | |
*/ | |
@TargetApi(Build.VERSION_CODES.M) | |
public static boolean isDozing(Context context) { | |
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | |
PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); | |
return powerManager.isDeviceIdleMode(); | |
} else { | |
return false; | |
} | |
} | |
public final static class Result { | |
private final NetworkInfo info; | |
public Result(NetworkInfo info) { | |
this.info = info; | |
} | |
public boolean isConnected() { | |
return info != null && info.isConnected(); | |
} | |
public boolean isWifi() { | |
return isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI; | |
} | |
public boolean isMobile() { | |
return isConnected() && info.getType() == ConnectivityManager.TYPE_MOBILE; | |
} | |
public boolean isFast() { | |
return isConnected() && isConnectionFast(info.getType(), info.getSubtype()); | |
} | |
private 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; | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment