activeNetworkInfo.type 在 API 级别 28 中已弃用 [英] activeNetworkInfo.type is deprecated in API level 28

查看:27
本文介绍了activeNetworkInfo.type 在 API 级别 28 中已弃用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用连接管理器,它提供了用于检查 Android 中网络类型的方法 activeNetworkInfo.type.此方法在 API 级别 28 中已弃用.那么在 API 28 中检查网络类型的解决方案是什么.我的代码是:

I want to use the Connectivity manager which provide the method activeNetworkInfo.type for checking the type of network in Android. This method was deprecated in API level 28. so what is the solution to check network type in API 28. my code is :

/**
 * 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
}

我的摇篮就像:

compileSdkVersion 28
buildToolsVersion '28.0.3'
defaultConfig {
        minSdkVersion 21
        targetSdkVersion 28
    }

推荐答案

UPDATE

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() 在 API 级别 28 中已弃用

现在我们需要使用 Callers 应该切换到检查 NetworkCapabilities.hasTransport(int)

Now we need to use Callers should switch to checking NetworkCapabilities.hasTransport(int)

还有 getAllNetworkInfo() 在 API 级别 29 中已弃用

现在我们需要使用 getAllNetworks() 而不是 getNetworkInfo(android.net.Network) .

Now we need to use getAllNetworks() instead of 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
      }
      

      这篇关于activeNetworkInfo.type 在 API 级别 28 中已弃用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆