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