NetworkStatsManager.queryDetailsForUid не получает "те же" значения, что и TrafficStats

Я сравниваю новый NetworkStats класс с TrafficStats для измерения трафика для сетевых интерфейсов и данного приложения (pex Chrome)

поскольку TrafficStats имеет значения, так как устройство загружает тест, который я выполняю, это:

  1. Перезагрузите телефон.
  2. Откройте Chrome.
  3. Загрузить данные 10 МБ (через WiFi).

Данные, полученные с TrafficStats это:

TrafficStats.getTotalRxBytes() aprox 17.21 MB
TrafficStats.getUidRxBytes(chromeUid) aprox 13.22 MB

Я даю разрешение на NetworkStats и значения, которые я получаю, это:

wifiBucket.getRxBytes() + mobileBucket.getRxBytes() aprox 17.23 MB
dataFromWiFiBucket[1] + dataFromMobileBucket[1] gives 0 bytes

Код для получения данных из NetworkStats является следующим:

long timeStamp = System.currentTimeMillis();
long bootTime = System.currentTimeMillis() - SystemClock.elapsedRealtime();

NetworkStats.Bucket wifiBucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_WIFI, null, bootTime, timeStamp);
NetworkStats.Bucket mobileBucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE, subscriberID, bootTime, timeStamp);

NetworkStats wifiBucketForApp = networkStatsManager.queryDetailsForUid(ConnectivityManager.TYPE_WIFI, null, bootTime, timeStamp, chromeUid);
NetworkStats mobileBucketForApp = networkStatsManager.queryDetailsForUid(ConnectivityManager.TYPE_MOBILE, subscriberID, bootTime, timeStamp, chromeUid);

long[] dataFromWiFiBucket = getDataFromBucket(wifiBucketForApp);
long[] dataFromMobileBucket = getDataFromBucket(mobileBucketForApp);

куда getDataFromBucket является:

@RequiresApi(api = Build.VERSION_CODES.M) public static long[] getDataFromBucket(NetworkStats bucketForApp) {

    long dataTx = 0;
    long dataRx = 0;

    NetworkStats.Bucket bucket;

    while (bucketForApp.hasNextBucket()) {
        bucket = new NetworkStats.Bucket();
        bucketForApp.getNextBucket(bucket);
        dataTx += bucket.getTxBytes();
        dataRx += bucket.getRxBytes();

    }

    return new long[]{dataTx, dataRx};
}

Я где-то читал, что ведра от двух часов, поэтому я добавил этот код:

if (bootTime > (timeStamp - TimeUnit.HOURS.toMillis(TWO_HOURS))) {
    bootTime = timeStamp - TimeUnit.HOURS.toMillis(TWO_HOURS);
}

Но данные для хрома по-прежнему 0, потому что wifiBucketForApp а также mobileBucketForApp нет никаких ведер.

Если я установлю bootTime к началу дня (его 18:30 в моей стране) я получаю:

wifiBucket.getRxBytes() + mobileBucket.getRxBytes() aprox 44.74 MB (expected because is since the beginning of the day)
dataFromWiFiBucket[1] + dataFromMobileBucket[1] gives 26.32 MB

Кто-нибудь знает, почему я не получаю такие же значения, как TrafficStats поскольку устройство загружается с NetworkStatsManager для приложения Chrome?

0 ответов

Поскольку это не трафик вашего собственного приложения, вам необходимо вручную разрешить доступ к данным об использовании в настройках устройства.

Другие вопросы по тегам