2

有没有办法计算 Android 中通过 WiFi/LAN 消耗和传输的数据?我可以通过 和 方法查看移动互联网(3G、4G)的统计数据,TrafficStats但是WiFi 呢?getMobileTxBytes()getMobileRxBytes()

4

2 回答 2

1

更新:下面的原始答案很可能是错误的。我得到的 WiFi/LAN 数字太高了。仍然没有弄清楚为什么(似乎无法通过 WiFi/LAN 测量流量),但一个老问题提供了一些见解:如何在 TrafficStats 中获取正确发送和接收的字节数?


找到了我自己的答案。

首先,定义一个名为 getNetworkInterface() 的方法。我不确切知道“网络接口”是什么,但我们需要它返回的字符串令牌来构建包含字节数的文件的路径。

private String getNetworkInterface() {
    String wifiInterface = null;
    try {
        Class<?> system = Class.forName("android.os.SystemProperties");
        Method getter = system.getMethod("get", String.class);
        wifiInterface = (String) getter.invoke(null, "wifi.interface");
    } catch (Exception e) {
        e.printStackTrace();
    }
    if (wifiInterface == null || wifiInterface.length() == 0) {
        wifiInterface = "eth0";
    }
    return wifiInterface;
}

接下来,定义 readLongFromFile()。我们实际上将有两个文件路径——一个用于发送的字节,一个用于接收的字节。此方法简单地封装读取提供给它的文件路径并将计数作为 long 返回。

private long readLongFromFile(String filename) {
    RandomAccessFile f = null;
    try {
        f = new RandomAccessFile(filename, "r");
        String contents = f.readLine();
        if (contents != null && contents.length() > 0) {
            return Long.parseLong(contents);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (f != null) try { f.close(); } catch (Exception e) { e.printStackTrace(); }
    }
    return TrafficStats.UNSUPPORTED;
}

最后,构建返回通过 WiFi/LAN 发送和接收的字节数的方法。

private long getNetworkTxBytes() {
    String txFile = "sys/class/net/" + this.getNetworkInterface() + "/statistics/tx_bytes";
    return readLongFromFile(txFile);
}

private long getNetworkRxBytes() {
    String rxFile = "sys/class/net/" + this.getNetworkInterface() + "/statistics/rx_bytes";
    return readLongFromFile(rxFile);
}

现在,我们可以通过像上面的移动互联网示例那样来测试我们的方法。

long received = this.getNetworkRxBytes();
long sent = this.getNetworkTxBytes();

if (received == TrafficStats.UNSUPPORTED) {
    Log.d("test", "TrafficStats is not supported in this device.");
} else {
    Log.d("test", "bytes received via WiFi/LAN: " + received);
    Log.d("test", "bytes sent via WiFi/LAN: " + sent);
}

于 2012-11-28T11:11:57.707 回答
1

(这实际上是对您答案的评论,没有足够的分数来真正评论,但是......) TrafficStats.UNSUPPORTED并不一定意味着该设备不支持读取 WiFi 流量统计信息。对于我的三星 Galaxy S2,包含统计信息的文件在禁用 WiFi 时不存在,但在启用 WiFi 时有效。

于 2013-02-24T13:42:14.357 回答