Получите isActiveNetworkMetered и isDefaultNetworkActive в API 29 - PullRequest
0 голосов
/ 09 апреля 2020

После того, как connectivityManager.getActiveNetworkInfo () устарел в API 29, было довольно сложно собрать функцию мониторинга сети, которая также отличала бы guish измеренный (ячейка) от WiFi-соединения.

Проблемы, с которыми я столкнулся, были 2:

  1. connectivityManager.isActiveNetworkMetered () - когда были включены и данные Wi-Fi, и мобильные данные, они возвращали значение true (по крайней мере, на моем эмуляторе, и я не мог проверить устройство). Когда был включен только WiFi, он возвращал false, как и ожидалось.

  2. connectivityManager.isDefaultNetworkActive () - он всегда будет активен, даже если WiFi и Mobile были отключены.

Единственный способ обойти это - через (1) onCapabilitiesChanged () и (2) getActiveNetwork () == null. Код вставлен ниже.

Знаете ли вы, есть ли другие способы сделать это? Вся реализация кажется громоздкой, а inte rnet полон устаревших примеров.

Спасибо

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);
    }
...