【问题标题】:ConnectivityManager.getActiveNetworkInfo() / NetworkInfo is deprecated in API 29. What's an alternative?ConnectivityManager.getActiveNetworkInfo() / NetworkInfo 在 API 29 中已弃用。有什么替代方案?
【发布时间】:2019-11-20 20:48:09
【问题描述】:

看起来像 API 29 上的整个 NetworkInfo is deprecated

所以我正在寻找一种替代方法来检查网络是否已连接。 例如。替代

connectivityManager.activeNetworkInfo?.isConnected == true

旁注:我知道现在有回调,但我想同步获取此信息。另外,我当然知道这可能不是一个准确的信息,尽管我想拥有它。

【问题讨论】:

标签: android android-connectivitymanager


【解决方案1】:

解决办法是这样的:

val capability = connectivityManager.getNetworkCapabilities(connectivityManager.activeNetwork)
return capability?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) ?: false
【解决方案2】:

这适用于 API 29:

connectivityManager.isDefaultNetworkActive

【讨论】:

  • 这似乎仍然返回true,即使在飞行模式下。
  • 在飞行模式下可以有一个活跃的网络。引用Techopedia:In general, features like FM receiver, Bluetooth, Wi-Fi and GPS should still be operable even when the device is in airplane mode
【解决方案3】:
android.net.NetworkInfo

此类在 API 级别 29 中已弃用。 您应该改用ConnectivityManager.NetworkCallback API 来了解连接更改

参考链接https://developer.android.com/reference/android/net/NetworkInfo.html

ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder builder = new NetworkRequest.Builder();

connectivityManager.registerNetworkCallback(
                    builder.build(),
                    new ConnectivityManager.NetworkCallback() {

                        @Override
                        public void onAvailable(Network network) {
                            // Network Available
                        }


                        @Override
                        public void onLost(Network network) {
                            // Network Not Available
                        }
                    }
            );

【讨论】:

    【解决方案4】:

    解决办法是

    public void registerNetworkCallback()
    {
        try {
            ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkRequest.Builder builder = new NetworkRequest.Builder();
    
            connectivityManager.registerNetworkCallback(builder.build(),new ConnectivityManager.NetworkCallback() {
                        @Override
                        public void onAvailable(Network network) {
                            Variables.isNetworkConnected = true; // Global Static Variable
                        }
                        @Override
                        public void onLost(Network network) {
                            Variables.isNetworkConnected = false; // Global Static Variable
                        }
                    }
    
            );
            Variables.isNetworkConnected = false;
        }catch (Exception e){
            Variables.isNetworkConnected = false;
        }
    }
    

    在此处查看完整代码:Gist

    【讨论】:

      【解决方案5】:
      private boolean checkInternetConnection(Activity activity) {
          ConnectivityManager connectivityManager = (ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE);
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
              Network network = null;
              if (connectivityManager == null) {
                  return false;
              } else {
                  network = connectivityManager.getActiveNetwork();
                  NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(network);
                  if (networkCapabilities == null) {
                      return false;
                  }
                  if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) ||
                          networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                      return true;
                  }
              }
          } else {
              if (connectivityManager == null) {
                  return false;
              }
              if (connectivityManager.getActiveNetworkInfo() == null) {
                  return false;
              }
              return connectivityManager.getActiveNetworkInfo().isConnected();
          }
          return false;
      }
      

      【讨论】:

      • 感谢您对社区的贡献。这可能是一个正确的答案,但对您的代码提供额外的解释会很有用,以便开发人员能够理解您的推理。这对于可能不熟悉语法的新开发人员特别有用。此外,它可以帮助减少对后续问题的需求。您介意用更多详细信息更新您的评论吗?
      猜你喜欢
      • 1970-01-01
      • 2016-08-16
      • 2023-03-13
      • 2022-10-05
      • 2022-06-10
      • 2022-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多