Ali*_*ian 5 android internet-connection kotlin
我有一个返回设备连接状态的函数,它一直工作正常,除了当设备连接到 VPN 时,当网络不可用时,它会给出误报
fun isConnected(): Boolean {
var result = false
val connectivityManager =
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val networkCapabilities = connectivityManager.activeNetwork ?: return false
val actNw =
connectivityManager.getNetworkCapabilities(networkCapabilities) ?: return false
result = when {
actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true
actNw.hasTransport(NetworkCapabilities.TRANSPORT_VPN) -> true
else -> false
}
} else {
connectivityManager.run {
connectivityManager.activeNetworkInfo?.run {
result = when (type) {
ConnectivityManager.TYPE_WIFI -> true
ConnectivityManager.TYPE_MOBILE -> true
ConnectivityManager.TYPE_ETHERNET -> true
ConnectivityManager.TYPE_VPN -> true
else -> false
}
}
}
}
return result
}
Run Code Online (Sandbox Code Playgroud)
如果你想确认你的网络是否有互联网,你不能只测试connectivityManager.activeNetwork和actNw.hasTransport。
connectivityManager.activeNetwork将返回 VPN,因为它是活动网络,无论是否有互联网。actNw.hasTransport只是让您知道连接的传输方式。如果您不关心传输,您可以完全删除该代码。
您应该检查的是NET_CAPABILITY_INTERNET和NET_CAPABILITY_VALIDATED。
表明该网络应该能够访问互联网。
表示该网络上的连接已成功验证。例如,对于具有 NET_CAPABILITY_INTERNET 的网络,这意味着已成功检测到 Internet 连接。
因此,您真正需要的是检查活动网络是否具有这两种功能,以确定您是否连接到具有 Internet 连接的网络。
actNw.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
actNw.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1709 次 |
| 最近记录: |