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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐