我想使用连接管理器,它提供activeNetworkInfo.type方法来检查Android中的网络类型.这个方法在API级别28中已弃用.那么在API 28中检查网络类型的解决方案是什么.我的代码是:
/**
* Check Wi Fi connectivity
*/
fun isWiFiConnected(context: Context): Boolean {
val connManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
return connManager.activeNetworkInfo.type == ConnectivityManager.TYPE_WIFI
}
我的Gradle就像:
compileSdkVersion 28
buildToolsversion '28.0.3'
defaultConfig {
minSdkVersion 21
targetSdkVersion 28
}
解决方法:
Yes getType()
is deprecated in API lavel 28
现在我们需要使用Use Callers切换到检查NetworkCapabilities.hasTransport(int)
也是 getAllNetworkInfo()
is deprecated in API level 29
现在我们需要使用Use 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
}