NetworkStatsManager.queryDetailsForUid没有获得"相同"值为TrafficStats

时间:2016-12-12 16:39:28

标签: android android-trafficstats networkstatsmanager

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

由于TrafficStats具有自设备启动以来的值,因此我执行的测试是:

  1. 重新启动手机。
  2. 打开Chrome。
  3. 下载10 MB数据(通过WiFi)。
  4. 使用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,因为wifiBucketForAppmobileBucketForApp没有任何存储分区。

    如果我将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应用从StringParameterValue设备启动了吗?

1 个答案:

答案 0 :(得分:0)

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