Kotlin实现Android应用网络连接有效性验证的正确方案
在Kotlin开发的Android应用中检查网络连接的正确方式
StackOverflow及网络上多数旧方法已被废弃,仅检查网络是否存在或判断Wi-Fi、蜂窝数据等传输类型并不够——比如网络显示可用但实际是EDGE网络、突然断开或无法正常通信的情况。最佳方案是利用系统框架内置的机制验证网络实际可联网,无需应用自行发送Ping请求。
实现代码
private fun android.content.Context.isNetworkAvailable(): Boolean { val connectivityManager = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager val nw = connectivityManager.activeNetwork ?: return false val actNw = connectivityManager.getNetworkCapabilities(nw) ?: return false return when { actNw.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && actNw.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) && actNw.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED) && (actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) || actNw.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH)) -> true else -> false } }
代码解释
- 使用
android.content.Context作为扩展函数的接收者,避免重复导入;若项目中多次使用,可提前导入android.content.Context后直接用Context。 - 初始化
ConnectivityManager、当前活跃网络及网络能力对象,任何一步为空则直接返回false。 - 检查
NET_CAPABILITY_INTERNET:确认网络具备访问互联网的基础能力。 - 检查
NET_CAPABILITY_VALIDATED:这是核心验证项,确保网络已通过系统验证,可正常连接互联网。 - 检查
NET_CAPABILITY_NOT_SUSPENDED:确保网络未被系统暂停(比如低电量模式下的限制)。 - 最后验证网络属于支持的传输类型(Wi-Fi/蜂窝/以太网/蓝牙),所有条件满足则返回
true,否则返回false。
这种方式能100%验证网络连通性,切勿仅依赖空值检查或简单的网络状态标识。
内容的提问来源于stack exchange,提问作者Pavlos Theodorou
相关产品推荐
相关产品推荐

