如何使用新的NetworkStatsManager类获取所有UID的数据使用情况报告

时间:2016-08-05 07:44:55

标签: android android-6.0-marshmallow networkstatsmanager

我正在构建一个数据管理器应用程序,它需要通过移动和wifi接口的每个应用程序数据使用情况报告。

在尝试使用方法" NetworkStatsManager.querySummary"时,我只获得某些UID的使用情况报告,但不是全部。虽然该方法的API documentation确实说

  

结果已过滤,仅包含属于主叫用户的uid

我不清楚哪个UID属于主叫用户,哪些不属于。请帮助我理解差异以及如何使用这个新的" NetworkStatsManager"来获取所有UID的数据使用报告。类。

2 个答案:

答案 0 :(得分:1)

可以获取设备的摘要。只需使用其他方法:android.app.usage.NetworkStatsManager#querySummaryForDevice。以下是示例用法:

<强>无线网络

NetworkStats.Bucket bucket;
try {
    bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_WIFI,
            "",
            0,
            System.currentTimeMillis());
} catch (RemoteException e) {
    return -1;
}

移动

public long getAllTxBytesMobile(Context context) {
    NetworkStats.Bucket bucket;
    try {
        bucket = networkStatsManager.querySummaryForDevice(ConnectivityManager.TYPE_MOBILE,
                getSubscriberId(context, ConnectivityManager.TYPE_MOBILE),
                0,
                System.currentTimeMillis());
    } catch (RemoteException e) {
        return -1;
    }
    return bucket.getTxBytes();
}

private String getSubscriberId(Context context, int networkType) {
    if (ConnectivityManager.TYPE_MOBILE == networkType) {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        return tm.getSubscriberId();
    }
    return "";
}

获取Rx或Tx字节,只需调用:

bucket.getRxBytes();
bucket.getTxBytes();

制作样本Github repo以证明其用法。

答案 1 :(得分:1)

问题就像询问每个应用的数据使用情况一样。不是整个设备的使用。因此,对于每个uid,我们需要相应的应用程序的数据使用。以下内容用于获取特定uid的数据使用情况。这也不适用于所有设备。我检查过,后来才明白,在某些设备中,即使我们提供了应用使用跟踪权限,也无法使用。这是系统级权限。

long dataUsageWithRespectToUid = getPackageRxBytesMobile(this)+ getPackageTxBytesMobile(this)+ getPackageRxBytesWifi()+ getPackageTxBytesWifi();

public long getPackageRxBytesMobile(Context context) {
    NetworkStats networkStats = null;
    try {
        networkStats = networkStatsManager.queryDetailsForUid(
                ConnectivityManager.TYPE_MOBILE,
                getSubscriberId(context, ConnectivityManager.TYPE_MOBILE),
                0,
                System.currentTimeMillis(),
                packageUid);
    } catch (RemoteException e) {
        return -1;
    }
    NetworkStats.Bucket bucket = new NetworkStats.Bucket();
    networkStats.getNextBucket(bucket);
    networkStats.getNextBucket(bucket);
    return bucket.getRxBytes();
}

public long getPackageTxBytesMobile(Context context) {
    NetworkStats networkStats = null;
    try {
        networkStats = networkStatsManager.queryDetailsForUid(
                ConnectivityManager.TYPE_MOBILE,
                getSubscriberId(context, ConnectivityManager.TYPE_MOBILE),
                0,
                System.currentTimeMillis(),
                packageUid);
    } catch (RemoteException e) {
        return -1;
    }
    NetworkStats.Bucket bucket = new NetworkStats.Bucket();
    networkStats.getNextBucket(bucket);
    return bucket.getTxBytes();
}

public long getPackageRxBytesWifi() {
    NetworkStats networkStats = null;
    try {
        networkStats = networkStatsManager.queryDetailsForUid(
                ConnectivityManager.TYPE_WIFI,
                "",
                0,
                System.currentTimeMillis(),
                packageUid);
    } catch (RemoteException e) {
        return -1;
    }
    NetworkStats.Bucket bucket = new NetworkStats.Bucket();
    networkStats.getNextBucket(bucket);
    return bucket.getRxBytes();
}

public long getPackageTxBytesWifi() {
    NetworkStats networkStats = null;
    try {
        networkStats = networkStatsManager.queryDetailsForUid(
                ConnectivityManager.TYPE_WIFI,
                "",
                0,
                System.currentTimeMillis(),
                packageUid);
    } catch (RemoteException e) {
        return -1;
    }
    NetworkStats.Bucket bucket = new NetworkStats.Bucket();
    networkStats.getNextBucket(bucket);
    return bucket.getTxBytes();
}