我有一个必须在离线和在线模式下工作的应用。应用程序必须根据当前网络连接的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
由于
答案 0 :(得分:1)
不对任何服务器执行ping操作就无法获得下载/上传速度。由于您的服务器不支持ping,因此您可以使用第三方ping网站。
使用JSpeedTest库,您可以轻松实现。该库中提供了一些所需的功能。如
等级:
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"