Java 在API 29中获取isActiveNetworkMetered和isDefaultNetworkActive

Java 在API 29中获取isActiveNetworkMetered和isDefaultNetworkActive,java,android,android-10.0,Java,Android,Android 10.0,当connectivityManager.getActiveNetworkInfo()在API 29中被弃用后,整合一个网络监控功能来区分计量(小区)和WiFi连接是一件非常困难的事情 我面临的问题有2个: connectivityManager.isActiveNetworkMetered()--当WiFi和移动数据都打开时,它返回true(至少在我的模拟器上是这样,我无法在设备上检查)。当只打开WiFi时,它返回false,正如预期的那样 ConnectionManager.isDefaul

当connectivityManager.getActiveNetworkInfo()在API 29中被弃用后,整合一个网络监控功能来区分计量(小区)和WiFi连接是一件非常困难的事情

我面临的问题有2个:

  • connectivityManager.isActiveNetworkMetered()--当WiFi和移动数据都打开时,它返回true(至少在我的模拟器上是这样,我无法在设备上检查)。当只打开WiFi时,它返回false,正如预期的那样

  • ConnectionManager.isDefaultNetworkActive()--即使WiFi和移动设备关闭,它也将始终处于活动状态

  • 我发现解决这个问题的唯一方法是通过(1)onCapabilitiesChanged()和(2)getActiveNetwork()==null。代码粘贴在下面

    你知道还有其他的方法吗?整个实现看起来很麻烦,互联网上到处都是不推荐的例子

    谢谢

    private static void monitorNetworks(){
            NetworkRequest.Builder builder = new NetworkRequest.Builder();
    
            connectivityManager.registerNetworkCallback(
                    builder.build(),
                    ncb = new ConnectivityManager.NetworkCallback() {
                        @Override
                        public void onAvailable(Network network) {
                            scanAndSend();
                        }
    
                        @Override
                        public void onLost(Network network) {
                            scanAndSend();
                        }
    
                        @Override
                        public void onUnavailable(){
                            scanAndSend();
                        }
    
                        @Override
                        public void onCapabilitiesChanged (Network network,
                                                           NetworkCapabilities networkCapabilities){
                            boolean metered = !networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
                            Log.d(TAG, "NET_CAPABILITY_NOT_METERED: " +
                                    String.valueOf(networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)));
                            sendMetered(metered);
                        }
                    }
            );
        }
    
        private static void scanAndSend(){
            boolean is_connected = false;
            if(connectivityManager.getActiveNetwork()==null) is_connected = false;
            else is_connected = true;
            sendConnectivityIntent(IS_NETWORK_AVAILABLE, is_connected);
        }
    
        private static void sendMetered(boolean metered) {
            sendIntent(IS_NETWORK_METERED, metered);
        }
    
        private static void sendIntent(String val_name, boolean val) {
            Intent intent = new Intent();
            intent.setAction(CONNECTIVITY_ACTION);
            intent.putExtra(val_name, val);
            context.sendBroadcast(intent);
        }
    

    请注意,“计量”完全独立于所使用的技术(wifi vs cell)。有无限的手机计划和计量无线接入点。我明白了。。。但问题仍然存在:如果我同时启用了计量和非计量,isActiveNetworkMetered()将是真的——从表面上看,“计量”完全独立于所使用的技术(wifi vs cell)。有无限的手机计划和计量无线接入点。我明白了。。。但问题仍然存在:如果我同时启用了计量和非计量,那么isActiveNetworkMetered()将是真的——从表面上看