API 30及以上版本如何检测网络连接?NetworkCapabilities错误求助
问题解决:NetworkCapabilities检测网络连接报错
错误原因
你误用了API方法:hasCapability()要求传入NetworkCapabilities.NET_CAPABILITY_*系列的能力常量,而TRANSPORT_WIFI、TRANSPORT_CELLULAR属于网络传输类型标识,应该用hasTransport()方法来判断。
修正后的代码
fun checkInternetConnection(context: Context): Boolean { val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val network = connectivityManager.activeNetwork ?: return false val networkCapabilities = connectivityManager.getNetworkCapabilities(network) ?: return false return when { networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true else -> false } }
进阶优化(可选)
如果需要确保网络真正能访问互联网(而非仅连接上网络),建议同时验证网络有效性:
fun checkValidInternetConnection(context: Context): Boolean { val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val network = connectivityManager.activeNetwork ?: return false val networkCapabilities = connectivityManager.getNetworkCapabilities(network) ?: return false return networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) }
内容的提问来源于stack exchange,提问作者Berkay Sazak
相关产品推荐
相关产品推荐

