オフラインモードとオンラインモードで動作するアプリがあります。アプリケーションは、現在のネットワーク接続(Wifiまたはデータ)のインターネット速度に基づいて、アプリケーションサーバーにリクエストを送信する必要があります。
Wifiが接続されている場合、このコードを使用して現在の接続のWifi信号強度を取得できます。
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int level = WifiManager.calculateSignalLevel(wifiInfo.getRssi(), 5);
OR
wifiInfo.getLinkSpeed();
モバイルインターネットがつながっていれば、リスナークラスを使って強さを実感できました
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
super.onSignalStrengthsChanged(signalStrength);
int obj = signalStrength.getGsmSignalStrength();
int dBm = (2 * obj) -113;
}
上記のコードは、速度ではなく信号強度を取得します。では、接続されているネットワークの現在の速度を取得するにはどうすればよいですか?
通常、ストアまたはWebサイトにある速度テストアプリは、特定のファイルを送信またはダウンロードするか、リモートサーバーにpingし、経過時間を使用して速度を計算することで速度をチェックします。
このアップロード/ダウンロードまたはping機能は、通信先のアプリケーションサーバーではサポートされていないため、使用できません。
では、リアルタイムで実行できる現在のインターネット接続の速度を確認する別の方法はありますか?
どんなリードも役に立ちます。
PS:このリンクには、現在のネットワークの接続タイプをチェックするためのコードがあります。しかし、LTE信号は十分な強度がありますが、インターネット接続が非常に遅い、または非常に遅い場合があります。そのため、これも正確な解決策にはなりません。
サーバーにpingを送信しないと、ダウンロード/アップロード速度を取得できません。サーバーがpingをサポートしていないため、サードパーティのpingサイトを使用できます。
JSpeedTest ライブラリを使用すると、簡単に実行できます。このライブラリでは、必要な機能の一部を利用できます。といった
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());
}
});