Android - почему ConnectivityManager.isActiveNetworkMetered всегда возвращает значение true (даже при использовании Wi-Fi)

В моем приложении потоковой передачи музыки для Android приведенный ниже путь к коду помогает выбрать между высоким потоком битрейта и более низким битрейтом на основе значений, возвращаемых экземпляром класса ConnectivityManager.

Я пытаюсь понять, почему ConnectivityManager.isActiveNetworkMetered () будет возвращать "true", когда очевидно, что я нахожусь в локальной сети Wi-Fi. Возьмите следующий код Android / Java:

boolean isMetered = false;
boolean isWifi = false;
boolean isEthernet = false;
boolean isRoaming = false;
boolean isConnected = false;

NetworkInfo netinfo = connManager.getActiveNetworkInfo();
if (netinfo != null)
{
    isWifi = (netinfo.getType() == ConnectivityManager.TYPE_WIFI);
    isEthernet = (netinfo.getType() == ConnectivityManager.TYPE_ETHERNET);
    isRoaming = netinfo.isRoaming();
    isConnected = netinfo.isConnected();

    Log.d(TAG, "active network type = " + netinfo.getTypeName());
    Log.d(TAG, "active network subtype = " + netinfo.getSubtypeName());


    Log.d(TAG, "isConnected = " + isConnected);
    Log.d(TAG, "isWifi = " + isWifi);
    Log.d(TAG, "isEthernet = " + isEthernet);
    Log.d(TAG, "isRoaming = " + isRoaming);
}

// isActiveNetworkMetered was introduced in API 16 (Jelly Bean)
if (android.os.Build.VERSION.SDK_INT >= 16)
{
    isMetered = connManager.isActiveNetworkMetered();
    Log.d(TAG, "isMetered = " + isMetered);
}

Когда у меня отключен Wi-Fi, и мое единственное соединение - с сетью LTE от AT & T, оно выводит на консоль журнала следующее:

active network type = mobile
active network subtype = LTE
isConnected = true
isWifi = false
isEthernet = false
isRoaming = false
isMetered = true

Все выше соответствует ожиданиям - я нахожусь в сети мобильной связи, которая измеряется.

Теперь переключитесь на мой домашний Wi-Fi, и тот же блок кода напечатает это:

active network type = WIFI
active network subtype = 
isConnected = true
isWifi = true
isEthernet = false
isRoaming = false
isMetered = true

ПочемуisMetered, результатisActiveNetworkMetered, все еще показывая какправда? Это приводит к тому, что следующий путь к коду способствует более низкому потоку битрейта, даже если я нахожусь в моей домашней сети Wi-Fi:

if ((isWifi || isEthernet) && !isMetered)
{
    result = BITRATE_HIGH_KBIT_SEC;
}
else
{
    result = BITRATE_LOW_KBIT_SEC;
}

Как isActiveNetworkMetered () решает, измерена ли сеть? Это часть переговоров по WIFI или немного в трансляции SSID? Сетевые настройки на Android? На моем устройстве Android Kitkat не было ни одной настройки, которая позволяла бы мне переключать или обнаруживать настройку для сети с измерением.

На прошлой неделе я, мой провайдер (Frontier) прислал мне новый Wifi роутер. Возможно связано? Я не видел ничего на страницах прошивки роутера для такой настройки.

Позже сегодня я пойду на работу, чтобы посмотреть, как она себя ведет в другой сети. В любом случае, я, вероятно, отредактирую приведенный выше код, чтобы пропустить проверочную проверку, если я не смогу доказать, что это просто неправильная настройка где-то.

ОБНОВИТЬ - проблема с постоянным возвратом замеренных сетевых реплик на моем телефоне HTC One M8 (под управлением Kitkat), но не на моем Nexus 7 с 2012 года (также обновленном до Android 4.4 Kitkat).

ЗАДАЧА РЕШЕНА - оказывается, мой Wi-Fi был помечен моим телефоном как "Мобильная точка доступа". Подробнее о том, как найти и переключить этот флагВот.

Ответы на вопрос(1)

Ваш ответ на вопрос