Получите текущую скорость интернета (мобильный и Wi-Fi) с помощью Android
У меня есть приложение, которое должно работать в автономном и онлайн-режиме. Приложение должно делать запросы к серверу приложений на основе скорости интернет-соединения текущего сетевого подключения (Wifi или Data).
Если Wi-Fi подключен, я могу получить уровень сигнала Wi-Fi текущего соединения, используя этот код.
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int level = WifiManager.calculateSignalLevel(wifiInfo.getRssi(), 5);
ИЛИ ЖЕ
wifiInfo.getLinkSpeed();
Если мобильный интернет подключен, я смог получить силу голоса с помощью класса слушателя
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
super.onSignalStrengthsChanged(signalStrength);
int obj = signalStrength.getGsmSignalStrength();
int dBm = (2 * obj) -113;
}
Приведенные выше коды получают уровень сигнала, а не скорость. Итак, как мне узнать текущую скорость подключенной сети?
Обычно приложения для проверки скорости, обнаруженные в магазинах или на веб-сайтах, проверяют скорость, отправляя или загружая определенный файл или проверяя связь с удаленным сервером, а затем вычисляя скорость, используя истекшее время.
Эта функция загрузки/выгрузки или проверки связи не поддерживается сервером приложений, с которым я общаюсь, поэтому я не могу использовать это.
Итак, есть ли альтернативный способ проверить скорость текущего интернет-соединения, который можно сделать в режиме реального времени?
Любые выводы могут быть полезны.
PS: эта ссылка имеет код для проверки типа подключения текущей сети. Но есть случаи, когда у меня есть сигнал LTE с полной силой, но нет/очень медленное интернет-соединение. Так что это тоже не будет точным решением для меня.
https://gist.github.com/emil2k/5130324
Ответы
Ответ 1
Вы не можете получить скорость загрузки/выгрузки без проверки связи с любым сервером. Поскольку ваш сервер не поддерживает пинг, вы можете использовать сторонний сайт для пинга.
С библиотекой JSpeedTest вы можете сделать это легко. Некоторые из ваших желаемых функций доступны в этой библиотеке. Такие как
- тест скорости загрузки
- загрузка теста скорости
- мониторинг прогресса загрузки/выгрузки
- настраиваемое имя хоста/порт/uri (имя пользователя и пароль для FTP)
- настраиваемое время ожидания сокета и размер куска
- настроить хранилище загружаемых файлов
Gradle:
compile 'fr.bmartel:jspeedtest:1.32.1'
Пример кода:
SpeedTestSocket speedTestSocket = new SpeedTestSocket();
// add a listener to wait for speedtest completion and progress
speedTestSocket.addSpeedTestListener(new ISpeedTestListener() {
@Override
public void onCompletion(SpeedTestReport report) {
// called when download/upload is complete
System.out.println("[COMPLETED] rate in octet/s : " + report.getTransferRateOctet());
System.out.println("[COMPLETED] rate in bit/s : " + report.getTransferRateBit());
}
@Override
public void onError(SpeedTestError speedTestError, String errorMessage) {
// called when a download/upload error occur
}
@Override
public void onProgress(float percent, SpeedTestReport report) {
// called to notify download/upload progress
System.out.println("[PROGRESS] progress : " + percent + "%");
System.out.println("[PROGRESS] rate in octet/s : " + report.getTransferRateOctet());
System.out.println("[PROGRESS] rate in bit/s : " + report.getTransferRateBit());
}
});