Android: как определить скорость сети в Android программно

Как показать медленное интернет-соединение пользователю, когда сеть подключена Примечание: не тип сети (2G, 3G, 4G, WIFI)

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
17
1
36 936
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Вы не можете проверить это напрямую.

Однако вы можете пропинговать сервер и посмотреть, будет ли ответ очень долгим или вообще не вернется.

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

У вас есть фрагмент кода, как это можно сделать?

Denny 18.12.2020 11:33

Фрагмент кода для проверки связи? Или вы имеете в виду один для теста скорости, чтобы затем рассчитать скорость загрузки в кбит / с?

jalako 19.12.2020 12:49

Самое простое, что вы можете сделать, это проверить URL-адрес, время безотказной работы которого составляет почти 100%, например, www.google.com. С момента запуска запроса до момента его завершения вы можете просто измерить объем данных, которые вы загрузили для запроса. Итак, у вас есть данные (пространство) и потраченное время. Просто разделите пространство на время, чтобы получить скорость сети. Это несколько неточно, потому что это также зависит от URL-адреса, который вы проверяете.

Требуется минимальный API: 21. Я использую ConnectivityManager в сочетании с NetworkCapabilities, чтобы получить пропускную способность как входящего, так и исходящего трафика. Работает просто отлично. Вы можете решить, является ли скорость 2G, 3G или 4G на уровне скорости в кбит/с.

ConnectivityManager cm = (ConnectivityManager)this.getSystemService(CONNECTIVITY_SERVICE);
NetworkCapabilities nc = cm.getNetworkCapabilities(cm.getActiveNetwork());
var downSpeed = nc.getLinkDownstreamBandwidthKbps();
var upSpeed = nc.getLinkUpstreamBandwidthKbps();
  • 2G GSM ~14,4 Кбит/с
  • G GPRS ~26,8 Кбит/с
  • E EDGE ~108,8 Кбит/с
  • 3G UMTS ~128 Кбит/с
  • H HSPA ~3,6 Мбит/с
  • H+ HSPA+ ~14,4 Мбит/с-23,0 Мбит/с
  • 4G LTE ~50 Мбит/с
  • 4G LTE-A ~500 Мбит/с

Скачивание файла — это слишком сложное решение, потому что, в конце концов, вы не несете ответственности за интернет-соединение пользователей — они (или, скорее, их поставщик услуг)! Предоставления им информации, основанной на их текущем статусе, более чем достаточно для большинства случаев использования. Это дает вам быстрый способ проверить текущую скорость соединения перед выполнением операций.

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

  • ПЛОХОЕ // Пропускная способность менее 150 кбит/с.
  • УМЕРЕННЫЙ // Пропускная способность от 150 до 550 кбит/с.
  • ХОРОШО // Пропускная способность более 2000 кбит/с.
  • ОТЛИЧНО // Пропускная способность более 2000 кбит/с.
  • НЕИЗВЕСТНО // качество соединения не может быть обнаружено.

Вы можете проверить детали в этой статье https://android.jlelse.eu/designing-android-apps-to-handle-slow-network-speed-dedc04119aac

Проверьте скорость интернета для Мобильная сеть, чтобы использовать этот код

ConnectivityManager connectivityManager = (ConnectivityManager)this.getSystemService(CONNECTIVITY_SERVICE);
NetworkCapabilities nc = connectivityManager.getNetworkCapabilities(connectivityManager.getActiveNetwork());
var downSpeed = nc.getLinkDownstreamBandwidthKbps();
var upSpeed = nc.getLinkUpstreamBandwidthKbps();

Если проверить скорость интернета для Wi-Fi сеть использовать этот код

public int getWifiLevel()
{
    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    int linkSpeed = wifiManager.getConnectionInfo().getRssi();
    int level = WifiManager.calculateSignalLevel(linkSpeed, 5);
    return level;
}

И более подробная информация по этой ссылке

https://android.jlelse.eu/designing-android-apps-to-handle-slow-network-speed-dedc04119aac

Я надеюсь это тебе поможет!

Спасибо.

Ответ принят как подходящий

Определение скорости вашей сети - (Низкая скорость Интернета)

Использование класса NetworkInfo, ConnectivityManager и TelephonyManager для определения типа вашей сети.

Загрузите любой файл из Интернета и посчитайте, сколько времени это заняло по сравнению с количеством байтов в файле. (Единственный возможный способ определения скорости проверки)

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

ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    //should check null because in airplane mode it will be null
    NetworkCapabilities nc = cm.getNetworkCapabilities(cm.getActiveNetwork());
    int downSpeed = nc.getLinkDownstreamBandwidthKbps();
    int upSpeed = nc.getLinkUpstreamBandwidthKbps();

Для этого требуется уровень API 21

Vadim Kotov 10.06.2019 13:38

для этого требуется уровень API 23

Nitish 23.09.2019 09:37

getLinkUpstreamBandwidthKbps и getLinkDownstream Bandwidth Kbps в разных сетях всегда возвращают одно и то же значение. Почему?

Luca Biasotto 23.01.2020 14:22

У меня тоже такие значения. Я думаю, что это не сработает, так как может вернуть только максимальную пропускную способность, поддерживаемую сетью. В моем случае возвращает 1048576, т.е. 1 Гбит/с, что невозможно в той сети, к которой я подключался. Во-вторых, само имя класса «NetworkCapabilities» говорит о возможностях сети, поэтому оно говорит о максимальных возможностях этой сети.

Shanki Bansal 03.03.2020 13:36

Это не работает, поскольку они сказали, что возвращает максимальную скорость загрузки и выгрузки в сети.

Jeyaseelan 19.04.2021 08:52

ОБНОВЛЕНИЕ - УСТАРЕВШАЯ БИБЛИОТЕКА - больше не поддерживается

оригинальный пост:

Вы можете использовать Класс сетевого подключения через Facebook.

Его ConnectionClassStateChangeListener имеет метод с именем onBandwidthStateChange, который возвращает экземпляр класса качество соединения:

public interface ConnectionClassStateChangeListener {
  public void onBandwidthStateChange(ConnectionQuality bandwidthState);
}

Класс ConnectionQuality — это класс перечисления, определенный следующим образом:

public enum ConnectionQuality {
  /**
   * Bandwidth under 150 kbps.
   */
  POOR,
  /**
   * Bandwidth between 150 and 550 kbps.
   */
  MODERATE,
  /**
   * Bandwidth between 550 and 2000 kbps.
   */
  GOOD,
  /**
   * EXCELLENT - Bandwidth over 2000 kbps.
   */
  EXCELLENT,
  /**
   * Placeholder for unknown bandwidth. This is the initial value and will stay at this value
   * if a bandwidth cannot be accurately found.
   */
  UNKNOWN
}

Извините за отрицательный голос :(. Библиотека, на которую вы указали, не обновлялась с 2015 года и сообщила о проблемах с Android 9+. Я бы посоветовал ПРОТИВ использовать эту библиотеку, если она не будет обновлена ​​​​в будущем (если это когда-либо произойдет, я убери мой минус. Обещаю :) )

Psest328 16.01.2020 14:57

я преобразовал этот репозиторий в kotlin, и он работает в Android 10. проверьте это здесь

bhavin 09.06.2021 12:07

Другие вопросы по теме