确定网络连接带宽(速度)wifi和移动数据

5
我希望获取以 kbps 或 mbps 为单位的网络连接带宽。如果设备连接到 WiFi,则应返回网络带宽(速度)以及移动数据。
它将返回 WiFi 的能力速率,但我想要确切的数据传输速率。
public String getLinkRate() 
{
    WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
    WifiInfo wi = wm.getConnectionInfo();
    return String.format("%d Mbps", wi.getLinkSpeed());
}
1个回答

4

您无法直接查询此信息。您的互联网速度由您的ISP确定和控制,而不是由您的网络接口或路由器确定。

因此,您唯一可以获得(当前)连接速度的方法是从足够近的位置下载文件,并计时检索文件所需的时间。例如:

static final String FILE_URL = "http://www.example.com/speedtest/file.bin";
static final long FILE_SIZE = 5 * 1024 * 8; // 5MB in Kilobits

long mStart, mEnd;
Context mContext;
URL mUrl = new URL(FILE_URL);
HttpURLConnection mCon = (HttpURLConnection)mUrl.openConnection();
mCon.setChunkedStreamingMode(0);

if(mCon.getResponseCode() == HttpURLConnection.HTTP_OK) {
    mStart = new Date().getTime();

    InputStream input = mCon.getInputStream();
    File f = new File(mContext.getDir("temp", Context.MODE_PRIVATE), "file.bin");
    FileOutputStream fo = new FileOutputStream(f);
    int read_len = 0;

    while((read_len = input.read(buffer)) > 0) {
        fo.write(buffer, 0, read_len);
    }
    fo.close();
    mEnd = new Date().getTime();
    mCon.disconnect();

    return FILE_SIZE / ((mEnd - mStart) / 1000);
}

这段代码稍作修改(需要将mContext替换为有效的上下文),并在AsyncTask或工作线程中执行,将下载远程文件并返回文件下载速度(以Kbps为单位)。


如果是非对称的(例如ADSL或3G),那么您的下载速度和上传速度将会不同。 - jww

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接