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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章