Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Android获取当前互联网速度(移动和Wifi)_Android_Android Wifi_Telephonymanager_Wifimanager - Fatal编程技术网

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

使用Android获取当前互联网速度(移动和Wifi),android,android-wifi,telephonymanager,wifimanager,Android,Android Wifi,Telephonymanager,Wifimanager,我有一个应用程序,必须在离线和在线模式下工作。应用程序必须根据当前网络连接(Wifi或数据)的互联网速度向应用程序服务器发出请求 如果连接了Wifi,我可以使用此代码获取当前连接的Wifi信号强度 WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionIn

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

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

WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int level = WifiManager.calculateSignalLevel(wifiInfo.getRssi(), 5);

如果连接了移动互联网,我可以使用listener类获得信号强度

@Override
    public void onSignalStrengthsChanged(SignalStrength signalStrength) {
        super.onSignalStrengthsChanged(signalStrength);
        int obj  = signalStrength.getGsmSignalStrength();
        int dBm = (2 * obj) -113;
 }
上述代码获取信号强度,而不是速度。那么,如何获得连接网络的当前速度

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

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

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

任何线索都会有帮助

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


如果不ping任何服务器,就无法获得下载/上传速度。由于您的服务器不支持ping,您可以使用第三方ping站点

有了图书馆,你可以很容易地做到这一点。此库中提供了您所需的一些功能。比如

  • 速度测试下载
  • 速度测试上传
  • 下载/上传进度监控
  • 可配置主机名/端口/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());
    }
});

只需将这个名为的类添加到项目中并调用以下方法即可-

TrafficUtils.getNetworkSpeed()
但首先,在您的
AndroidManifest.xml
-

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"


可能对你有帮助人们使用ping的原因是因为没有其他方法可以精确。一条链路可能支持高达100 Mbps的速率,但由于拥塞,您可能只能获得2 Mbps的速率。知道这一点的唯一方法是计算。如果你想访问bar.com,知道你的链接支持100Mbps到foo.com也是没有帮助的,因为bar.com很拥挤,只能支持10个。任何其他方法都是近似的。找到一篇有用的文章。看看你有没有试过这个样本:@Ankit Mehta没有。我没有试过这个样本。在我看来,如果没有对任何服务器的ping,就无法检查连接速度。我想检查互联网速度并相应地设置图像或视频url,例如,如果当前互联网速度介于
50kbps-150kbps
link1、
150kbps-500kbps
link2和
>500kbps
link3之间。那个么如何实现呢?这个库在vpn上不工作,我尝试了speedTestSocket.setProxyServer(“);它抛出了错误无效的\u HTTP\u响应:解析HTTP帧时出错,无效的\u HTTP\u响应:错误状态代码-1
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"