Как определить медленное интернет-соединение в приложении для Android

Я хочу определить, есть ли у телефона медленное интернет-соединение или высокоскоростной интернет.

Теперь они устарели NetworkInfo и предлагают использовать ConnectivityManager#getNetworkCapabilities, используя это. Я могу получить мощность сигнала, но не могу понять, как использовать целочисленное значение, возвращаемое networkCapabilities.getSignalStrength()

Он возвращает целочисленное значение. Я получаю эти значения (-39, -71, -31). Мой вопрос в том, как мы должны определить, что уровень сигнала хороший/плохой.

Вот мой код для получения уровня сигнала:

ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
        Network activeNetwork = cm.getActiveNetwork();
        NetworkCapabilities networkCapabilities = cm.getNetworkCapabilities(activeNetwork);
        int signalStrength = networkCapabilities.getSignalStrength();

person Harsh Shah    schedule 06.01.2021    source источник


Ответы (2)


допустим, вы решили, что 2G работает медленно, вы можете определить сеть 2G следующим образом.

NetworkInfo network = connectivity.getActiveNetworkInfo();
int netSubType = network.getSubtypeName();
if(netSubType == TelephonyManager.NETWORK_TYPE_GPRS ||
    netSubType == TelephonyManager.NETWORK_TYPE_EDGE ||
    netSubType == TelephonyManager.NETWORK_TYPE_1xRTT) {
  //user is in slow network
}

См. класс TelephonyManager для получения дополнительных таких постоянных значений.

person Usama Altaf    schedule 06.01.2021
comment
Теперь они устарели от NetworkInfo и предлагают использовать ConnectivityManager#getNetworkCapabilities. В этом проблема. - person Harsh Shah; 06.01.2021

Во-первых, это директивный подход, а не прямой ответ на вопрос.

int signalStrength = networkCapabilities.getSignalStrength();

Док:

Это целое число со знаком, причем более высокие значения указывают на более сильный сигнал. Точные единицы зависят от носителя. Например, Wi-Fi использует те же единицы измерения RSSI, о которых сообщает код Wi-Fi.

Это означает, что signalStrength содержит значение, относящееся к каналу-носителю сигнала; например, если каналом является WiFi, то signalStrength будет отражать те же единицы WiFi RSSI.

RSSI, или «Индикатор уровня принимаемого сигнала», — это показатель того, насколько хорошо ваше устройство может слышать сигнал от точки доступа или маршрутизатора. Это значение полезно для определения того, достаточно ли у вас сигнала для хорошего беспроводного соединения.

Таким образом, вам нужно сопоставить эти единицы с каким-то индикатором качества, чтобы узнать, слабый или сильный сигнал. Это зависит от связи/сигнала, а не от точки зрения программирования... Этот поток, а также этот может помочь вам в этом в случае носителя WiFi.

Но вам необходимо настроить этот уровень качества для других типов носителей сигнала таким же образом в соответствии с их единицами измерения RSSI.

GSM-сигнал, например, вы можете использовать CellSignalStrengthGsm, который имеет getRssi()

CellSignalStrengthLte предназначен для LTE и т. д.

Вы также можете получить уровень сигнала из API android.telephony SignalStrength. класс... существует метод getLevel(), который возвращает целое число от 0 до 4, представляющее общее качество сигнала. Здесь вы можете найти слушателя.

person Zain    schedule 07.01.2021
comment
Извините за поздний ответ. Спасибо за ваш ответ, позвольте мне следить за этим и информировать вас - person Harsh Shah; 12.01.2021