首页 文章

使用Android获取当前的互联网速度(移动和Wifi)

提问于
浏览
17

我有一个必须在离线和在线模式下工作的应用程序 . 应用程序必须根据当前网络连接(Wifi或数据)的Internet速度向应用服务器发出请求 .

如果连接了Wifi,我可以使用此代码获得当前连接的Wifi信号强度 .

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;
 }

上面的代码获得信号强度,而不是速度 . 那么,我如何获得连接网络的当前速度?

通常,在商店或网站中找到的速度测试应用程序通过发送或下载特定文件或ping远程服务器然后使用经过的时间计算速度来检查速度 .

我正在与之通信的应用服务器不支持此上传/下载或ping功能,因此我无法使用它 .

那么,有没有其他方法可以检查当前可以实时完成的互联网连接的速度?

任何线索都可能有所帮助 .

PS:此链接具有用于检查当前网络的连接类型的代码 . 但在某些情况下,我的LTE信号具有完整的强度但没有/非常慢的互联网连接 . 所以,对我来说,这也不是一个准确的解决方案 .

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

谢谢

1 回答

  • 1

    在不ping任何服务器的情况下,无法获得下载/上传速度 . 由于您的服务器不支持ping,您可以使用第三方pinging站点 .

    使用JSpeedTest库,您可以轻松完成 . 您可以在此库中找到一些所需的功能 . 如

    • 速度测试下载

    • 速度测试上传

    • 下载/上传进度监控

    • 可配置主机名/端口/ uri(FTP的用户名和密码)

    • 可配置的套接字超时和块大小

    • 配置上传文件存储

    摇篮:

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

相关问题