应用流量统计:NetworkStatsManager

Quibbler 1月前 109

应用流量统计:NetworkStatsManager


        NetworkStatsManager是 Android 6.0(API 级别 23)及以上版本中新增的一个类,主要用于提供网络使用历史统计信息。


1、权限

        在使用 NetworkStatsManager之前,需要在 AndroidManifest中添加权限声明,并在代码中引导用户开启权限:

    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions"/>

        通过AppOpsManager检查应用是否有使用情况访问权限:

    fun hasPermissionToReadNetworkStats(): Boolean {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return true
        
        val appOps = getSystemService(APP_OPS_SERVICE) as AppOpsManager
        val mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, Process.myUid(), packageName)
        return mode == AppOpsManager.MODE_ALLOWED
    }

        如果没有权限,则引导用户跳转到设置界面打开应用权限:

    // 打开“有权查看使用情况的应用”页面
    fun requestReadNetworkStats() {
        val intent: Intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)
        startActivity(intent)
    }

        一切准备就绪,开始查询应用的流量使用情况。 首先,获取NetworkStatsManager示例对象:

    val networkStatsManager: NetworkStatsManager = getSystemService(NETWORK_STATS_SERVICE) as NetworkStatsManager



2、查询

        NetworkStatsManager提供对网络使用历史和统计数据的访问,分为Summary queries(摘要查询)和 History queries(历史查询)

        Summary queries(摘要查询):这些查询汇总了整个时间间隔内的网络使用情况。因此,对于特定的密钥、状态、计量和漫游组合,只有一个桶。如果是用户范围和设备范围的摘要,则返回一个包含总网络使用情况的存储桶。

        History queries(历史查询):这些查询不会随时间聚合,但会聚合状态、计量和漫游。因此,一个特定的键可以有多个桶。

 

2.1、查询单个应用的流量

        要查询单个应用的流量,需要先获取应用的UID,然后使用以下方法:

    查询网络使用统计详情。结果过滤为仅包含属于呼叫用户的 uid(包含手机上每个应用的uid,统计所有应用总流量可用)
    queryDetails(int networkType, String subscriberId, long startTime, long endTime)

    查询指定 uid 的网络使用统计详细信息。(可查询单个应用流量)
    queryDetailsForUid(int networkType, String subscriberId, long startTime, long endTime, int uid)

    查询指定 uid 和标签的网络使用统计详细信息。
    queryDetailsForUidTag(int networkType, String subscriberId, long startTime, long endTime, int uid, int tag)

    查询给定 uid、标签和状态的网络使用统计详细信息。仅可用于属于主叫用户的 uid。结果不会随时间聚合。
    queryDetailsForUidTagState(int networkType, String subscriberId, long startTime, long endTime, int uid, int tag, int state)

    查询网络使用统计摘要。(查询多个应用流量统计)
    querySummary(int networkType, String subscriberId, long startTime, long endTime)


2.2、查询总流量

        可以通过以下方法查询设备的总流量消耗::

    查询网络使用统计摘要。结果是整个设备的汇总数据使用情况。结果是随着时间、状态、uid、标签、计量和漫游聚合的单个存储桶
    querySummaryForDevice(int networkType, String subscriberId, long startTime, long endTime)

    查询网络使用统计摘要。结果是属于调用用户的所有 uid 的汇总数据使用情况。结果是随着时间、状态和 uid 聚合的单个 Bucket。
    querySummaryForUser(int networkType, String subscriberId, long startTime, long endTime)



3、聚合结果Bucket

        拿到返回的NetworkStats.Bucket对象,就可以通过NetworkStats.Bucket类中的getTxBytes()getRxBytes()两个方法,它们分别用来获取网络数据的发送量和接收量。

        getRxBytes(): 此方法返回该统计桶(Bucket)中记录的数据接收量(以字节为单位)。接收量指的是设备接收到的数据量。

        /**
         * Number of bytes received during the bucket's time interval. Statistics are measured at
         * the network layer, so they include both TCP and UDP usage.
         * @return Number of bytes.
         */
        public long getRxBytes() {
            return mRxBytes;
        }

        getTxBytes(): 此方法返回该统计桶(Bucket)中记录的数据发送量(以字节为单位)。发送量指的是从设备发送出去的数据量。

        /**
         * Number of bytes transmitted during the bucket's time interval. Statistics are measured at
         * the network layer, so they include both TCP and UDP usage.
         * @return Number of bytes.
         */
        public long getTxBytes() {
            return mTxBytes;
        }

        简而言之,getTxBytes()表示“发送字节数”,而getRxBytes()表示“接收字节数”。这两个方法共同用来衡量设备或应用在一定时间内的网络数据使用情况,其中getTxBytes()统计的是上传的数据量,getRxBytes()统计的是下载的数据量。


        以上是 NetworkStatsManager的基本用法,包括获取实例、查询总流量和单个应用的流量,以及必要的权限设置


不忘初心的阿甘
最新回复 (0)
    • 安卓笔记本
      2
        登录 注册 QQ
返回
仅供学习交流,切勿用于商业用途。如有错误欢迎指出:fluent0418@gmail.com