android10解决NetworkInfo废弃替代NetworkInfo isConnected()问题
最近新项目接近尾声,进入处理疑难杂症阶段;着手处理各种兼容性问题。在监听系统网络广播变化方面遇到了一个问题,在Android 10 (系统sdk版本29)NetworkInfo被标记为Deprecated废弃状态,就是不推荐大家继续使用了。那么我们在Android10怎样判断网络类型和网络是否连接。
总所周知,Android一直以来通过NetworkInfo#getType()来判断网络连接类型
/** 判断网络类型:移动网络 */
public static boolean isMobile(Context) {
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
return null != networkInfo && networkInfo.getType() == ConnectivityManager.TYPE_MOBILE;
}
/** 判断网络类型:Wi-Fi类型 */
public static boolean isWifi(Context) {
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
return null != networkInfo && networkInfo.getType() == ConnectivityManager.TYPE_WIFI;
}
/** 判断网络是否连接 */
public static boolean isConnected(Context) {
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
return null != networkInfo && networkInfo.isConnected();
}
当时非常不幸,到了Android10 NetworkInfo被标记为废弃了,系统不推荐通过NetworkInfo#getType()判断网络类型,以及通过NetworkInfo#isConnected()判断网络是否联通。
经过一番搜索和资料查询,查到针对Android10,我们可以通过NetworkCapabilities判断网络类型和判断网络是否连接;
/**
* android10版本
* 判断网络类型:移动网络
*/
public static boolean isMobileQ29(Context) {
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
Network network = cm.getActiveNetwork();
if (null == network) {
return false;
}
NetworkCapabilities capabilities = cm.getActiveNetworkCapabilities(network);
if (null == capabilities) {
return false;
}
return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
}
/**
* android10版本
* 判断网络类型:Wi-Fi类型
*/
public static boolean isWifiQ29(Context) {
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
Network network = cm.getActiveNetwork();
if (null == network) {
return false;
}
NetworkCapabilities capabilities = cm.getActiveNetworkCapabilities(network);
if (null == capabilities) {
return false;
}
return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
}
/**
* android10版本
* 判断网络是否连接
*/
public static boolean isConnectedQ29(Context) {
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
Network network = cm.getActiveNetwork();
if (null == network) {
return false;
}
NetworkCapabilities capabilities = cm.getActiveNetworkCapabilities(network);
if (null == capabilities) {
return false;
}
return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
}
监听网络变化广播,也不同了。不推荐继续使用ConnectivityManager#CONNECTIVITY_ACTION广播。而是用NetworkCallback进行监听
示例代码如下:
/**
* Android10监听网络变化广播
*/
ConnectivityManager.NetworkCallback callback = new ConnectivityManager.NetworkCallback() {
// 可用网络接入
public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
// 一般在此处获取网络类型然后判断网络类型,就知道时哪个网络可以用connected
}
// 网络断开
public void onLost(Network network) {
// 如果通过ConnectivityManager#getActiveNetwork()返回null,表示当前已经没有其他可用网络了。
}
}
// 注册回调
private void registerNetworkCallback(Context context) {
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder = new NetworkRequest.Builder();
builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
cm.registerNetworkCallback(builder.build(), callback);
}
// 注销回调
private void unregisterNetworkCallback(Context context) {
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
cm.unregisterNetworkCallback(callback);
}
————————————————
版权声明:本文为CSDN博主「二流小宝」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/SweetTool/article/details/105377697