android10解决NetworkInfo废弃替代NetworkInfo isConnected()问题

                                                    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);
}

 

你可能感兴趣的:(android开发)