web-dev-qa-db-ja.com

Androidを使用して、インターネット(モバイルとWifi)の現在の速度を取得します

オフラインモードとオンラインモードで動作するアプリがあります。アプリケーションは、現在のネットワーク接続(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信号は十分な強度がありますが、インターネット接続が非常に遅い、または非常に遅い場合があります。そのため、これも正確な解決策にはなりません。

https://Gist.github.com/emil2k/5130324

17
user198530

サーバーにpingを送信しないと、ダウンロード/アップロード速度を取得できません。サーバーがpingをサポートしていないため、サードパーティのpingサイトを使用できます。

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());
    }
});
2