2

AndroidでWiFi/LANを介して消費および送信されたデータをカウントする方法はありますか?TrafficStatsとの方法getMobileTxBytes()でモバイルインターネット(3G、4G)の統計を確認できgetMobileRxBytes()ますが、WiFiはどうですか?

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()を定義します。実際には2つのファイルパスがあります。1つは送信されたバイト用で、もう1つは受信されたバイト用です。このメソッドは、提供されたファイルパスの読み取りをカプセル化し、カウントを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トラフィック統計の読み取りをサポートしていないことを意味するわけではありません。私のSamsungGalaxyS2の場合、WiFiが無効になっていると統計を含むファイルは存在しませんが、WiFiが有効になっていると機能します。

于 2013-02-24T13:42:14.357 に答える