9

我正在将新NetworkStats类与TrafficStats测量网络接口和给定应用程序(pex Chrome)的流量进行比较

由于TrafficStats自设备启动以来具有值,我正在执行的测试是这样的:

  1. 重启手机。
  2. 打开铬。
  3. 下载 10 mb 数据(通过 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);
}

但是 chrome 的数据仍然为 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

有人知道为什么我没有获得与Chrome 应用程序TrafficStats从设备启动以来相同的值吗?NetworkStatsManager

4

1 回答 1

0

由于这不是您自己的应用程序的流量,您需要在设备设置中允许手动访问使用数据。

于 2019-09-17T15:19:03.310 回答