判断 WiFi 是否打开
public static boolean isWiFiEnable(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager == null) {
return false;
}
NetworkInfo info = connectivityManager.getActiveNetworkInfo();
return !((info == null) || (!info.isAvailable())) && info.getType() == ConnectivityManager.TYPE_WIFI;
}
判断 GPRS 是否打开
public static boolean isMobileEnable(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager == null) {
return false;
}
NetworkInfo info = connectivityManager.getActiveNetworkInfo();
return !((info == null) || (!info.isAvailable())) && info.getType() == ConnectivityManager.TYPE_MOBILE;
}
判断 WiFi 与 GPRS 同开(1)
尝试:使用 isWifiEnable() 和 isMobileEnable() 联合判断。
public static boolean isAllEnable(Context context) {
return isWiFiEnable(context) && isMobileEnable(context);
}
结果:此方式无法判断 WiFi 与 GPRS 同开。
在 WiFi 和 GPRS 同时打开时系统默认使用 WiFi 网络,即networkInfo.getType()
的返回值是 TYPE_WIFI
,所以isMobileEnable()
的结果一定是false
导致判断失败。
既然在 WiFi 和 GPRS 同时打开时可以准确判断 WiFi 的状态,那么先使用isWifiEnable()
判断 WiFi 是否打开,再想办法替代isMobileEnable()
判断 GPRS 是否打开即可。
public static boolean isAllEnable(Context context) {
if (isWiFiEnable(context)) {
// TODO 判断移动数据网络是否打开
} else {
return false;
}
}
判断 WiFi 与 GPRS 同开(2)
观察ConnectivityManager
源码发现有这么一个函数:
尝试使用反射调用该函数判断 WiFi 开启时 GPRS 的状态发现是可行的。
public static boolean isMobileEnableReflex(Context context) {
try {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
Method getMobileDataEnabledMethod = ConnectivityManager.class.getDeclaredMethod("getMobileDataEnabled");
getMobileDataEnabledMethod.setAccessible(true);
return (Boolean) getMobileDataEnabledMethod.invoke(connectivityManager);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
最终,可行的判断 WiFi 和 GPRS 同开的方式如下:
public static boolean isAllEnable(Context context) {
return isWiFiEnable(context) && isMobileEnableReflex(context);
}