【问题标题】:Query for ConnectivityManager getActiveNetwork查询 ConnectivityManager getActiveNetwork
【发布时间】:2018-09-23 13:31:29
【问题描述】:

需要知道 getActiveNetwork 返回什么样的值。我使用的代码是:

    ConnectivityManager connectivityManager =  (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);    
    Network network = connectivityManager.getActiveNetwork(); 
    Log.e(TAG,"Network : " + network.toString());

输出是返回数字,这个数字究竟意味着什么?

【问题讨论】:

  • Rite 现在我在我的日志中收到了这个:Network = 138

标签: android android-networking


【解决方案1】:

很好,很多人提到在 6.0 SDK 版本之前不推荐使用 connectivityManager.activeNetworkInfo.typeconnectivityManager.activeNetworkInfo.typeName

我遇到了类似的情况,必须同时支持最低 5.0 和 >= 6.0 的设备。这对我有用。

if (SDK_INT >= M) {
        connectivityManager.activeNetwork
                ?.let { connectivityManager.getNetworkCapabilities(it) }
                ?.takeIf { it.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) }
                ?.takeIf { connectivityManager.activeNetworkInfo.isConnected }
                ?.let { return "Wifi is Connected" 
                     //Just to make a point. Better be a sealed class.
                }
    } else {
        connectivityManager.activeNetworkInfo
                ?.takeIf { it.isConnected && it.type == ConnectivityManager.TYPE_WIFI }
                ?.let { return "Wifi is Connected" }
    }

 return "Wifi is Disconnected"

【讨论】:

    【解决方案2】:

    基于Network类的代码:

    @Override
    public String toString() { 
        return Integer.toString(netId);
    }
    

    返回值是分配给默认数据网络的 Network_Id。

    【讨论】:

      【解决方案3】:

      使用ConnectivityManager的方法通常是检查当前是否有网络访问。使用getActiveNetworkInfo,您可以检查是否有 Wifi、蓝牙或移动连接。

      例如,您可以通过以下方式检查您的应用程序是否可以通过 wifi 或移动网络访问互联网:

      ConnectivityManager connectivityManager =  (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
      NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
      if (networkInfo == null 
          || !networkInfo.isConnected() 
          || (networkInfo.getType() != ConnectivityManager.TYPE_WIFI 
          && networkInfo.getType() != ConnectivityManager.TYPE_MOBILE)) {
           // No internet connectivity for any reason
      }
      

      【讨论】:

      • 现在从 Android 9 P、API 28 开始已弃用。
      【解决方案4】:

      使用getActiveNetworkInfo() 代替getActiveNetwork()。在那里你会得到一个NetworkInfo 对象,它有一个getType() 方法。在 Javadoc 中,您可以找到所有可能的值。

      【讨论】:

        【解决方案5】:

        查看android官方文档 https://developer.android.com/reference/android/net/ConnectivityManager.html#getActiveNetwork()

        为了获得更好的结果,您可以使用 getActiveNetworkInfo。 它返回对象的类型。然后您可以将其与您想要的网络类型进行比较。看到ConnectivityManager getNetworkInfo(int) deprecated

        【讨论】:

          【解决方案6】:

          connectivityManager.getActiveNetwork(); 实际上返回一个与当前活动的默认数据网络相对应的网络对象。所以数字值将是分配给该活动网络的常量值。 如果你想检查什么类型的网络是活跃的。我在下面给你一个例子,检查一下。

          public boolean isNetworkConnected(Context mContext) {
                  final String DEBUG_TAG = "NetworkStatusExample";
                  ConnectivityManager connMgr = (ConnectivityManager) mContext.getSystemService(CONNECTIVITY_SERVICE);
                  boolean isWifiConn=false;
                  boolean isMobileConn=false;
                  Network nn=connMgr.getActiveNetwork();
                  Network[] networkinf=connMgr.getAllNetworks();
                  for (int a=0;a<networkinf.length;a++) {
                      NetworkCapabilities networkCapabilities = connMgr.getNetworkCapabilities(networkinf[a]);
                      if (networkCapabilities.hasTransport(networkCapabilities.TRANSPORT_CELLULAR)){
                          isMobileConn=true;
                      }
                      else if (networkCapabilities.hasTransport(networkCapabilities.TRANSPORT_WIFI)){
                          isWifiConn=true;
                      }
                  }
                  Log.i(DEBUG_TAG, "Wifi connected: " + isWifiConn);
                  Log.i(DEBUG_TAG, "Mobile connected: " + isMobileConn);
                  editor.putBoolean("isConnected",isMobileConn);
                  editor.apply();
                  if (isMobileConn || isWifiConn){
                      Log.i(DEBUG_TAG, "Network Status..." + isMobileConn);
                      return true;
                  }
                  else {
                      return false;
                  }
              }
          

          【讨论】:

            【解决方案7】:

            它返回网络状态,例如网络是否可用。如果你想要网络信息,那么你可以使用 getActiveNetworkInfo()。它将为您提供如下信息:

            NetworkInfo: type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: "WIFI_NAME", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false, simId: 0
            

            【讨论】:

            • 请尝试在答案的确切上下文中提供答案。如果没有,您可以添加评论。
            猜你喜欢
            • 1970-01-01
            • 2018-01-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-09-13
            • 2015-12-09
            相关资源
            最近更新 更多