如何替换已废弃的ConnectivityManager.allNetworks网络检测代码
Android 网络连接状态检测废弃代码替换方案
前置条件
首先需要在AndroidManifest.xml中声明网络状态访问权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
你代码中被标记废弃的allNetworks是Android 12(API 31)起废弃的字段API,官方推荐按业务场景选择以下替换方案:
方案1:常用场景 - 实时监听网络状态(推荐)
原代码中已经注册了DefaultNetworkCallback,我们可以直接结合回调能力更精准的监听网络变化,避免频繁主动轮询,替换后的完整代码如下:
private val isNetworkAvailable = MutableStateFlow(false) // 保存回调实例用于后续注销,避免内存泄漏 private var networkCallback: ConnectivityManager.NetworkCallback? = null fun checkNetworkAvailability(context: Context): MutableStateFlow<Boolean> { val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager networkCallback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { super.onAvailable(network) updateNetworkStatus(connectivityManager) } override fun onLost(network: Network) { super.onLost(network) updateNetworkStatus(connectivityManager) } override fun onCapabilitiesChanged( network: Network, networkCapabilities: NetworkCapabilities ) { super.onCapabilitiesChanged(network, networkCapabilities) updateNetworkStatus(connectivityManager) } } // 注册网络变化回调 connectivityManager.registerDefaultNetworkCallback(networkCallback!!) // 首次调用时初始化当前网络状态 updateNetworkStatus(connectivityManager) return isNetworkAvailable } private fun updateNetworkStatus(connectivityManager: ConnectivityManager) { val hasValidInternet = connectivityManager.activeNetwork?.let { network -> val capabilities = connectivityManager.getNetworkCapabilities(network) // 同时校验网络是否具备互联网能力、且已通过连通性验证 capabilities?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) == true && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) } ?: false isNetworkAvailable.value = hasValidInternet } // 请在组件销毁/不需要监听时调用该方法注销回调,避免内存泄漏 fun stopNetworkListener(context: Context) { val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager networkCallback?.let { connectivityManager.unregisterNetworkCallback(it) networkCallback = null } }
方案2:单次查询所有网络状态(替换原有遍历逻辑)
如果你确实需要遍历所有已注册的网络判断是否有可用网络,直接将原遍历部分的connectivityManager.allNetworks替换为connectivityManager.getAllNetworks()即可,该方法兼容API 21及以上版本,是官方指定的替代API:
var isConnected = false // 替换原废弃的allNetworks字段 connectivityManager.getAllNetworks().forEach { network -> val networkCapability = connectivityManager.getNetworkCapabilities(network) networkCapability?.let { if(it.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && it.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) { isConnected = true return@forEach } } }
低版本兼容说明
如果你的应用minSdk低于23,需要补充版本判断兼容旧版本系统:
val isConnected = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { connectivityManager.activeNetwork?.let { network -> val capabilities = connectivityManager.getNetworkCapabilities(network) capabilities?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) == true } ?: false } else { @Suppress("DEPRECATION") connectivityManager.activeNetworkInfo?.isConnected == true }
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

