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

问题描述

我想使用连接管理器,该管理器提供了activeNetworkInfo.type方法来检查Android中的网络类型.此方法已在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 or ConnectivityManager#getNetworkCapabilities or ConnectivityManager#getLinkProperties

Now we need to use ConnectivityManager.NetworkCallback API or ConnectivityManager#getNetworkCapabilities or ConnectivityManager#getLinkProperties

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

现在我们需要使用呼叫者,应该切换到检查 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) .

  • 返回有关特定网络的连接状态信息.
    • 返回框架当前跟踪的所有网络的数组.
    • 示例代码

      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
      }
      

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

09-02 23:56