Может ли кто-нибудь объяснить, как TrafficStats работает с магией в ОС Android?

Я написал небольшое приложение для Android, чтобы проверить использование данных, к сожалению, он в значительной степени зависит от android.net.TrafficStats, который был представлен с Froyo (Android 2.2).

Я пытаюсь вернуть этот class для своих пользователей, не являющихся пользователями Froyo, и что я могу определить из источника Android :

  1. TrafficStats.java – это только собственный указатель на файл ac
  2. Файл c открывает два файла (см. Ниже) и считывает их содержимое
  3. Если либо содержит числовое значение, оно возвращает его обратно, как подсчет «байтов»

Вот мой вызов … когда я вызываю TrafficStats через API на своем устройстве, я получаю чтение (например, 1113853 байта). Когда я открываю два файла и проверяю их содержимое, один файл не существует, а другой файл – 0 байт.

Так ясно, что я неправильно понял, что делает TrafficStats. Может ли кто-нибудь пролить свет на то, как он работает, это волшебство?

Спасибо за помощь.

(вот моя попытка портировать файл c в java)

package com.suttco.net; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import com.suttco.IOUtils; import com.suttco.StringUtils; import android.util.Log; public class TrafficStatsFile { private static final String mobileRxFile_1 = "/sys/class/net/rmnet0/statistics/rx_bytes"; private static final String mobileRxFile_2 = "/sys/class/net/ppp0/statistics/rx_bytes"; private static final String mobileTxFile_1 = "/sys/class/net/rmnet0/statistics/tx_bytes"; private static final String mobileTxFile_2 = "/sys/class/net/ppp0/statistics/tx_bytes"; private static final String LOGGING_TAG = TrafficStatsFile.class.getSimpleName(); public long getMobileRxBytes() { return tryBoth(mobileRxFile_1, mobileRxFile_2); } public long getMobileTxBytes() { return tryBoth(mobileTxFile_1, mobileTxFile_2); } // Return the number from the first file which exists and contains data private static long tryBoth(String a, String b) { long num = readNumber(a); return num >= 0 ? num : readNumber(b); } // Returns an ASCII decimal number read from the specified file, -1 on error. private static long readNumber(String filename) { File f = new File(filename); if(f.exists()) { if(f.canRead()) { try { Log.d(LOGGING_TAG, "f.length() = " + f.length()); String contents = IOUtils.readFileAsString(f); if(StringUtils.IsNotNullOrEmpty(contents)) { try { return Long.parseLong(contents); } catch(NumberFormatException nfex) { Log.w(LOGGING_TAG, "File contents are not numeric: " + filename); } } else { Log.w(LOGGING_TAG, "File contents are empty: " + filename); } } catch (FileNotFoundException fnfex) { Log.w(LOGGING_TAG, "File not found: " + filename, fnfex); } catch(IOException ioex) { Log.w(LOGGING_TAG, "IOException: " + filename, ioex); } } else { Log.w(LOGGING_TAG, "Unable to read file: " + filename); } } else { Log.w(LOGGING_TAG, "File does not exist: " + filename); } return -1; } } 

Вот рабочая, измененная версия вышеприведенного кода. Этот использует RandomAccessFile и не полагается на пользовательский imports но использует только встроенные функции String с их Exceptions .

 import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import android.util.Log; public class TrafficStatsFile { private static final String mobileRxFile_1 = "/sys/class/net/rmnet0/statistics/rx_bytes"; private static final String mobileRxFile_2 = "/sys/class/net/ppp0/statistics/rx_bytes"; private static final String mobileTxFile_1 = "/sys/class/net/rmnet0/statistics/tx_bytes"; private static final String mobileTxFile_2 = "/sys/class/net/ppp0/statistics/tx_bytes"; private static final String LOGGING_TAG = TrafficStatsFile.class.getSimpleName(); public long getMobileRxBytes() { return tryBoth(mobileRxFile_1, mobileRxFile_2); } public long getMobileTxBytes() { return tryBoth(mobileTxFile_1, mobileTxFile_2); } // Return the number from the first file which exists and contains data private static long tryBoth(String a, String b) { long num = readNumber(a); return num >= 0 ? num : readNumber(b); } // Returns an ASCII decimal number read from the specified file, -1 on error. private static long readNumber(String filename) { try { RandomAccessFile f = new RandomAccessFile(filename, "r"); try { Log.d(LOGGING_TAG, "f.length() = " + f.length()); String contents = f.readLine(); if(!contents.isEmpty() && contents!=null) { try { return Long.parseLong(contents); } catch(NumberFormatException nfex) { Log.w(LOGGING_TAG, "File contents are not numeric: " + filename); } } else { Log.w(LOGGING_TAG, "File contents are empty: " + filename); } } catch (FileNotFoundException fnfex) { Log.w(LOGGING_TAG, "File not found: " + filename, fnfex); } catch(IOException ioex) { Log.w(LOGGING_TAG, "IOException: " + filename, ioex); } }catch(FileNotFoundException ffe){ Log.w(LOGGING_TAG, "File not found: " + filename, ffe); } return -1; } } 

Изменение его на RandomAccessFile вместо файла.

Изменить: см. Ответ IBoS для рабочего кода. Изменение принятого ответа на него.

  • Значение тега ориентации EXIF ​​всегда 0 для изображения, сделанного с помощью приложения для портретов с вертикальной камерой
  • Вызов startIntentSenderForResult из fragmentа (Android Billing v3)
  • Добавление изображения в Toast?
  • Как передавать данные между fragmentами
  • Android - активность против FragmentActivity?
  • Использование onSaveInstanceState с fragmentами в backstack?
  • андроидная круглая галерея?
  • Ошибка выполнения команды 'ant' в Mac OS X 10.9 Mavericks при создании Android с помощью PhoneGap / Cordova
  • Android Thread для таймера
  • Могу ли я последовательно переключать асинхронную задачу (начиная с одной после завершения предыдущей асинтезы)
  • Android Studio: адаптируемая папка: как разместить изображения для нескольких точек на дюйм?
  • Interesting Posts

    Firefox на Ubuntu не может подключиться к локальному виртуальному хосту, когда сеть отключена

    Минимизация Jinternal Frame без нажатия кнопки

    Понимание REST: глаголы, коды ошибок и аутентификация

    Как войти в «корневую» учетную запись по умолчанию в Windows Subsystem для Linux Bash terminal

    Программное обеспечение удаленного рабочего стола, которое клиент не должен устанавливать ничего

    Найти записи разделов на физических дисках с помощью wmic

    Поставщик несовместим с версией клиента Oracle

    Как декомпилировать файл APK или DEX на платформе Android?

    Как эффективно использовать Rprof в R?

    как использовать okhttp для загрузки файла?

    Как разрешить «Ошибка HTTP 500.19 – Внутренняя ошибка сервера» на IIS7.0

    Visual Studio всегда выбирает неправильный xsd для App.config

    Как удалить конечные пробелы из расширений файлов и папок?

    Как получить IP-адрес всех хостов в локальной сети?

    HintPath vs ReferencePath в Visual Studio

    Давайте будем гением компьютера.