【问题标题】:What is alternative to ConnectivityManager.TYPE_WIFI deprecated in Android P API 28?Android P API 28 中不推荐使用 ConnectivityManager.TYPE_WIFI 的替代方法是什么?
【发布时间】:2019-03-19 20:44:27
【问题描述】:

ConnectivityManager.TYPE_WIFI 在 Android P API 28 中已弃用。此外,NetworkInfo#getTypeConnectivityManager.TYPE_MOBILE 也已弃用。

那么,它们的替代品是什么?我知道我们必须使用 NetworkCapabilities 类中的方法。但是,我无法将所有内容合并到一个地方,例如如何在 NetworkCapabilities 类中执行 getType() 以及如何在其上添加 WIFI 和蜂窝数据检查?

请帮忙。

【问题讨论】:

    标签: android android-sdk-manager android-api-levels


    【解决方案1】:

    您可以使用下面的 sn-p 来检查您是否有 Wifi 连接或蜂窝网络:

    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        Network network = connectivityManager.getActiveNetwork();
        NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
        return capabilities != null && (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR));
    }
    

    【讨论】:

    • 还有其他选择吗?
    • 我已经尝试了上面的代码然后我优化了我的代码结果是崩溃。所以我提出了一个问题stackoverflow.com/q/59745326/1384360,我需要你的帮助,谢谢
    【解决方案2】:

    使用以下方法.. 19/06/2019

    public boolean isconnectedToWifi(Context context) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivityManager == null) {
            return false;
        }
    
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            Network network = connectivityManager.getActiveNetwork();
            NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
            if (capabilities == null) {
                return false;
            }
            return capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
        } else {
            NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            if (networkInfo == null) {
                return false;
            }
            return networkInfo.isConnected();
        }
    }
    

    【讨论】:

      【解决方案3】:

      ConnectivityManager.TYPE_WIFI弃用。你应该使用NetworkCapabilities

      这取代了旧的 ConnectivityManager.TYPE_MOBILE 网络选择方法。与其指出需要 Wi-Fi,因为应用程序需要高带宽并在出现新的快速网络(如 LTE)时面临过时的风险,应用程序应该指定它需要高带宽。同样,如果应用程序需要不计费的网络进行批量传输,它可以指定而不是假设所有基于蜂窝的连接都是计费的,而所有基于 Wi-Fi 的连接都不是。

      应用程序应改为使用NetworkCapabilities.hasTransport(int)requestNetwork(NetworkRequest, NetworkCallback) 请求 合适的网络。支持的传输。

      你可以试试这个方法

      NetworkAgentInfo networkAgent;
      int type = ConnectivityManager.TYPE_NONE;
      if (networkAgent.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
           type = ConnectivityManager.TYPE_MOBILE;
      } else if (networkAgent.networkCapabilities.hasTransport(
           NetworkCapabilities.TRANSPORT_WIFI)) {
           type = ConnectivityManager.TYPE_WIFI;
      }
      

      【讨论】:

      • 这个答案漏掉了一个重要的步骤……你是怎么得到networkAgent的?
      • 请查看以上链接
      • 你是说NetworkAgentInfo源代码的链接?这并没有告诉任何人如何在运行时获取它的实例。
      • 什么是 NetworkAgetInfo?而且,您再次使用 ConnectivityManager.TYPE_WIFI 已被弃用
      【解决方案4】:

      这就是我在不使用已弃用的库和添加对 marshamallow 设备的支持的情况下检查 WIFI 是否可用的方法-

      @ExperimentalCoroutinesApi
          suspend fun isWifiAvailable(): Boolean {
              val connectivityManager =
                  ContextCompat.getSystemService(context, ConnectivityManager::class.java) ?: return false
              if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                  val networkCapabilities = connectivityManager.activeNetwork ?: return false
                  val activeNetwork =
                      connectivityManager.getNetworkCapabilities(networkCapabilities) ?: return false
                  return activeNetwork.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
              } else {
                  return connectivityManager.isNetworkAvailable(NetworkCapabilities.TRANSPORT_WIFI)
      //            val activeNetwork = connectivityManager.`activeNetworkInfo`
      //            return activeNetwork?.type == ConnectivityManager.TYPE_WIFI
              }
          }
      
          @ExperimentalCoroutinesApi
          private suspend fun ConnectivityManager.isNetworkAvailable(vararg transportType: Int): Boolean {
              return suspendCancellableCoroutine { continuation ->
                  val builder = NetworkRequest.Builder()
                  transportType.forEach {
                      builder.addCapability(it)
                  }
                  val networkRequest = builder.build()
                  val networkCallback = object : ConnectivityManager.NetworkCallback() {
                      override fun onAvailable(network: Network) {
                          super.onAvailable(network)
                          continuation.resume(true, null)
                          unregisterNetworkCallback(this)
                      }
      
                      override fun onLost(network: Network) {
                          super.onLost(network)
                          continuation.resume(false, null)
                          unregisterNetworkCallback(this)
                      }
      
                      override fun onUnavailable() {
                          super.onUnavailable()
                          continuation.resume(false, null)
                          unregisterNetworkCallback(this)
                      }
                  }
                  registerNetworkCallback(networkRequest, networkCallback)
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-15
        • 2021-11-16
        • 1970-01-01
        • 1970-01-01
        • 2012-03-03
        • 1970-01-01
        • 1970-01-01
        • 2018-03-21
        相关资源
        最近更新 更多