Android: Как программно определить скорость сети в Android - PullRequest
2 голосов
/ 14 марта 2019

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

Ответы [ 7 ]

1 голос
/ 14 марта 2019

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

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

Надеюсь, это поможет вам!

Спасибо.

0 голосов
/ 14 марта 2019

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

В ConnectionClassStateChangeListener есть метод с именем onBandwidthStateChange, который возвращает экземпляр ConnectionQuality class:

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
}
0 голосов
/ 14 марта 2019

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

Использование класса 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();
0 голосов
/ 14 марта 2019

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

  • POOR // Пропускная способность ниже 150 кбит / с.
  • MODERATE // Пропускная способность от 150 до 550 кбит / с.
  • ХОРОШО // Пропускная способность более 2000 кбит / с.
  • ОТЛИЧНО // Пропускная способность более 2000 кбит / с.
  • UNKNOWN // невозможно найти качество соединения.

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

0 голосов
/ 14 марта 2019

Требуется минимум 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 Мбит / с

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

0 голосов
/ 14 марта 2019

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

0 голосов
/ 14 марта 2019

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

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

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

...