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




Вы не можете проверить это напрямую.
Однако вы можете пропинговать сервер и посмотреть, будет ли ответ очень долгим или вообще не вернется.
Вы также можете сделать тест скорости. Однако в большинстве приложений это не имело бы особого смысла, потому что это зависание пользовательских данных.
У вас есть фрагмент кода, как это можно сделать?
Фрагмент кода для проверки связи? Или вы имеете в виду один для теста скорости, чтобы затем рассчитать скорость загрузки в кбит / с?
Самое простое, что вы можете сделать, это проверить 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();
Скачивание файла — это слишком сложное решение, потому что, в конце концов, вы не несете ответственности за интернет-соединение пользователей — они (или, скорее, их поставщик услуг)! Предоставления им информации, основанной на их текущем статусе, более чем достаточно для большинства случаев использования. Это дает вам быстрый способ проверить текущую скорость соединения перед выполнением операций.
Кажется, что Android не позволяет этого напрямую. Вы можете попробовать скачать какой-нибудь файл, чтобы определить скорость вашего интернета. Ниже приведен список качеств соединения:
Вы можете проверить детали в этой статье 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
для этого требуется уровень API 23
getLinkUpstreamBandwidthKbps и getLinkDownstream Bandwidth Kbps в разных сетях всегда возвращают одно и то же значение. Почему?
У меня тоже такие значения. Я думаю, что это не сработает, так как может вернуть только максимальную пропускную способность, поддерживаемую сетью. В моем случае возвращает 1048576, т.е. 1 Гбит/с, что невозможно в той сети, к которой я подключался. Во-вторых, само имя класса «NetworkCapabilities» говорит о возможностях сети, поэтому оно говорит о максимальных возможностях этой сети.
Это не работает, поскольку они сказали, что возвращает максимальную скорость загрузки и выгрузки в сети.
ОБНОВЛЕНИЕ - УСТАРЕВШАЯ БИБЛИОТЕКА - больше не поддерживается
оригинальный пост:
Вы можете использовать Класс сетевого подключения через 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+. Я бы посоветовал ПРОТИВ использовать эту библиотеку, если она не будет обновлена в будущем (если это когда-либо произойдет, я убери мой минус. Обещаю :) )
я преобразовал этот репозиторий в kotlin, и он работает в Android 10. проверьте это здесь