【问题标题】:How to fetch data usage report for ALL UID's using the new NetworkStatsManager class如何使用新的 NetworkStatsManager 类获取所有 UID 的数据使用报告
【发布时间】:2016-08-05 07:44:55
【问题描述】:

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

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

过滤结果以仅包含属于调用用户的 uid

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

【问题讨论】:

    标签: android android-6.0-marshmallow networkstatsmanager


    【解决方案1】:

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

    WiFi:

    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 演示用法。

    【讨论】:

    • 所以我浏览了您的存储库,发现它为每个 UID 提供了相同的信息 - 我不知道出了什么问题!
    • 我使用 JB 从 github 运行了这个应用程序。并通过 TrafficStats 获得了 TX 和 RX 的 -1 B。 NetworkStats 得到了预期的“未实施”。有计划更新以支持 JB 吗?
    【解决方案2】:

    问题就像询问每个应用的数据使用情况。不是整个设备的使用。因此,对于每个 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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 2021-01-06
      • 1970-01-01
      相关资源
      最近更新 更多