Есть ли способ подсчитать данные, потребляемые и передаваемые через WiFi/LAN в Android? Я могу проверить статистику по мобильному интернету (3G, 4G) TrafficStats
методами getMobileTxBytes()
и getMobileRxBytes()
, а как насчет WiFi?
Как подсчитать количество байтов, отправленных и полученных через WiFi/LAN?
Ответы (2)
(На самом деле это комментарий к вашему ответу, пока недостаточно баллов, чтобы комментировать, но...) TrafficStats.UNSUPPORTED
не обязательно означает, что устройство не поддерживает считывание статистики трафика WiFi. В случае моего Samsung Galaxy S2 файл, содержащий статистику, не существует, когда WiFi отключен, но работает, когда WiFi включен.
ОБНОВЛЕНИЕ: исходный ответ ниже, скорее всего, НЕВЕРНЫЙ. Цифры, которые я получаю для WiFi/LAN, слишком высоки. До сих пор не понял, почему (кажется, измерение трафика через WiFi/LAN невозможно), но старый вопрос дает некоторое представление: Как получить правильное количество отправленных и полученных байтов в TrafficStats?
Нашел свой собственный ответ.
Во-первых, определите метод с именем getNetworkInterface(). Я точно не знаю, что такое «сетевой интерфейс», но нам нужен токен String, который он возвращает, чтобы построить путь к файлу, содержащему количество байтов.
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(). На самом деле у нас будет два пути к файлам: один для отправленных байтов, а другой для полученных байтов. Этот метод просто инкапсулирует чтение предоставленного ему пути к файлу и возвращает количество в виде длинного числа.
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);
}
забастовка>