更新
ConnectivityManager.activeNetworkInfo
在API级别29中也已过时。
现在我们需要使用 ConnectivityManager.NetworkCallback API或ConnectivityManager#getNetworkCapabilities或ConnectivityManager#getLinkProperties
使用 ConnectivityManager#getNetworkCapabilities
的示例代码
private fun isInternetAvailable(context: Context): 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
else -> false
}
} else {
connectivityManager.run {
connectivityManager.activeNetworkInfo?.run {
result = when (type) {
ConnectivityManager.TYPE_WIFI -> true
ConnectivityManager.TYPE_MOBILE -> true
ConnectivityManager.TYPE_ETHERNET -> true
else -> false
}
}
}
}
return result
}
旧答案
是的,getType()
在API28中已被弃用。
现在我们需要使用 NetworkCapabilities.hasTransport(int) 进行检查。
getAllNetworkInfo()
在API29中已被弃用。
现在我们需要使用 getAllNetworks()
代替 getNetworkInfo(android.net.Network)
。
getNetworkInfo()
getAllNetworks()
示例代码
fun isWiFiConnected(context: Context): Boolean {
val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
val network = connectivityManager.activeNetwork
val capabilities = connectivityManager.getNetworkCapabilities(network)
capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
} else {
connectivityManager.activeNetworkInfo.type == ConnectivityManager.TYPE_WIFI
}
}
完整代码
@Suppress("DEPRECATION")
fun isInternetAvailable(context: Context): Boolean {
var result = false
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager?
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
cm?.run {
cm.getNetworkCapabilities(cm.activeNetwork)?.run {
result = when {
hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true
else -> false
}
}
}
} else {
cm?.run {
cm.activeNetworkInfo?.run {
if (type == ConnectivityManager.TYPE_WIFI) {
result = true
} else if (type == ConnectivityManager.TYPE_MOBILE) {
result = true
}
}
}
}
return result
}
connectivityManager.activeNetworkInfo?.isConnected == true
。现在我们应该怎么做?只需使用connectivityManager.activeNetwork != null
吗? - android developerisInternetAvailable()
和hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
返回false。 - Paul SpiesbergerConnectivityManager#getNetworkCapabilities
请查看更新的答案,我已经添加了使用ConnectivityManager#getNetworkCapabilities
的示例代码。 - AskNileshactNw
变量之后,在检查网络能力之前,你应该添加空值检查。getNetworkCapabilities 是可为空的。 - portfoliobuildernetworkInfo.isConnectedOrConnecting
更好且更可靠。谁知道我们是否需要检查TRANSPORT_VPN
呢? - Cheok Yan Cheng