使用Android

时间:2016-02-22 06:56:59

标签: android android-wifi telephonymanager

我有一个必须在离线和在线模式下工作的应用。应用程序必须根据当前网络连接的Internet速度(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;
 }

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

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

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

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

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

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

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

由于

2 个答案:

答案 0 :(得分:1)

不对任何服务器执行ping操作就无法获得下载/上传速度。由于您的服务器不支持ping,因此您可以使用第三方ping网站。

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

答案 1 :(得分:1)

您可以简单地将名为 TrafficUtils 的类添加到您的项目中并调用以下方法 -

TrafficUtils.getNetworkSpeed()

但首先,在您的 AndroidManifest.xml -

上添加以下两个权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"