【问题标题】:How to retrieve active network information in android如何在android中检索活动网络信息
【发布时间】:2020-04-22 16:18:42
【问题描述】:

我一直在开发一个 android 应用程序。对于其中一项功能,我需要活动的网络信息(即它是否与 Wi-Fi 或移动数据连接)。我从网上得到了这段代码。

NetworkInfo activeNetworkInfo = context.getSystemService(ConnectivityManager.class).getActiveNetworkInfo();

但此 API 已弃用,我不想使用任何已弃用的 API。

经过一番谷歌搜索后,我发现我们应该改用ConnectivityManager.NetworkCallback。但我无法举一个例子。我怎么能用这个?如果有人知道使用ConnectivityManager.NetworkCallback

,请帮助我

【问题讨论】:

    标签: java android


    【解决方案1】:

    在 Kotlin 中查看这个函数

    fun networkConnection(): Boolean {
            var networkAvailable = false
    
            val connectivityManager: ConnectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
            val network: Network = connectivityManager.activeNetwork!!
            val networkCapabilities: NetworkCapabilities = connectivityManager.getNetworkCapabilities(network)!!
    
            if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                networkAvailable = true
            } else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                networkAvailable = true
            } else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {
                networkAvailable = true
            }
    
            return networkAvailable
        }
    

    【讨论】:

      【解决方案2】:

      试试下面的代码:

      private void registerNetworkCallback(Context context) {
        final ConnectivityManager manager =
            (ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE);
        manager.registerNetworkCallback(
            new NetworkRequest.Builder()
                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
                .build(),
            new NetworkCallback() {
              @Override
              public void onAvailable(Network network) {
               /** here to get the available info
               this ternary operation is not quite true, because non-metered 
               doesn't yet mean, that it's wifi
               nevertheless, for simplicity let's assume that's true
               */
      
           Log.i("vvv", "connected to " + (manager.isActiveNetworkMetered() ? "LTE" : "WIFI"));
              }
             @Override
              public void onCapabilitiesChanged(Network network, 
               NetworkCapabilities networkCapabilities){
                   /**here to get the change network info
                    Value is TRANSPORT_CELLULAR, TRANSPORT_WIFI, 
                    TRANSPORT_BLUETOOTH, TRANSPORT_ETHERNET, TRANSPORT_VPN
                   */
                  if(networkCapabilities.hasTransport("type")){
                  }
               }
            });
      }
      

      【讨论】:

      • 我希望这不是针对移动连接。
      • 在onAvailable方法中,如何区分wifi和移动连接?
      • 可以使用manager.isActiveNetworkMetered() ? "LTE" : "WIFI"查看。 true 是避免大量网络数据,这意味着 LTE
      【解决方案3】:
      connectivityManager = (ConnectivityManager) 
      context.getSystemService(ConnectivityManager.class);
      
      
       @RequiresApi(api = Build.VERSION_CODES.M)
          private void getActiveNet() {
              Network currentNetwork = connectivityManager.getActiveNetwork();
      }
      

      【讨论】:

      • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
      【解决方案4】:

      请注意,“活动网络”在 android 中是“默认网络”的同义词。

      ConnectivityManager#getActiveNetworkInfo()

      返回有关当前活动的默认数据网络的详细信息...

      ConnectivityManager#registerDefaultNetworkCallback(NetworkCallback)

      注册以接收有关应用程序更改的通知 默认网络...

      因此,使用ConnectivityManager#registerDefaultNetworkCallback(NetworkCallback) 您可以监听默认(也称为“活动”)网络更改。不幸的是,这只会返回 Network 对象,它没有关于传输(Wi-Fi 与蜂窝网络)的信息,在这种情况下,您需要额外调用 ConnectivityManager#getNetworkCapabilities(Network) 以获取该信息。

      这是一个例子:

      final ConnectivityManager connectivityManager = (ConnectivityManager)
        context.getSystemService(Context.CONNECTIVITY_SERVICE);
      
      final NetworkCallback networkCallback = new NetworkCallback() {
        @Override
        void onAvailable(Network network) {
            // Triggers when a default network is available.
            NetworkCapabilities nc = connectivityManager.getNetworkCapabilities(network);
            boolean isWifi = nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
            boolean isCellular = nc.hasTransport(NetworkCapabilities. TRANSPORT_CELLULAR);
        }
      };
      
      connectivityManager.registerDefaultNetworkCallback(networkCallback);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-18
        • 2021-03-14
        • 1970-01-01
        相关资源
        最近更新 更多