Android中ConnectivityManager.TYPE_MOBILE已废弃,如何修改网络检测代码?
修复ConnectivityManager废弃API问题,适配新版Android的网络连接检测代码
原代码中使用的ConnectivityManager.TYPE_MOBILE、TYPE_WIFI以及getNetworkInfo()方法在Android API 29(Android 10)及以上已被官方废弃,需要改用基于NetworkCapabilities的新API来实现网络连接检测,同时兼容旧版本系统。
修改后的完整代码
package com.aniketjain.weatherapp.network; import android.content.Context; import android.net.ConnectivityManager; import android.net.Network; import android.net.NetworkCapabilities; import android.os.Build; public class InternetConnectivity { public static boolean isInternetConnected(Context context) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivityManager == null) { return false; } // Android 10及以上版本的检测逻辑 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { Network activeNetwork = connectivityManager.getActiveNetwork(); if (activeNetwork == null) { return false; } NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork); return networkCapabilities != null && (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)); } // Android 5.0到Android 9的兼容逻辑 else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Network activeNetwork = connectivityManager.getActiveNetwork(); if (activeNetwork == null) { return false; } NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork); return networkCapabilities != null && (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)); } // Android 5.0以下的兜底逻辑(已废弃API仅作为兼容) else { return connectivityManager.getActiveNetworkInfo() != null && connectivityManager.getActiveNetworkInfo().isConnected(); } } }
关键修改说明
- 替换废弃常量:用
NetworkCapabilities.TRANSPORT_CELLULAR替代TYPE_MOBILE,TRANSPORT_WIFI替代TYPE_WIFI,同时新增TRANSPORT_ETHERNET支持以太网连接检测,覆盖更多网络场景 - 版本适配逻辑:
- API 29+:通过
getActiveNetwork()获取当前活跃网络,再调用getNetworkCapabilities()判断网络传输类型 - API 21-28:使用
NetworkCapabilities的兼容逻辑,避免直接调用已废弃方法 - API 20及以下:保留
getActiveNetworkInfo()作为兜底,确保旧版本系统的兼容性
- API 29+:通过
- 空值安全处理:增加了
ConnectivityManager、Network、NetworkCapabilities的空值判断,避免运行时空指针异常
必要权限
确保在AndroidManifest.xml中添加网络状态权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
内容的提问来源于stack exchange,提问作者Airat72
相关产品推荐
相关产品推荐

