2

我正在编写显示移动数据使用情况的应用程序的一部分,并且我还希望它显示用户安装应用程序之前的数据。目前,每当我在某个设备上安装应用程序之前查询某个时间范围的数据时,都会NetworkStatsManager.queryDetails返回一个NetworkStats不包含存储桶的对象。

在应用程序安装日期之后,我已经设法获得有关移动数据使用情况的正确数据。

奇怪的是,我试图删除设置中的所有缓存/数据并卸载并重新安装该应用程序。在此之后,该应用程序仍然能够在卸载它之前查询数据,但不是从我第一次安装该应用程序之前的数据。我的直觉是,Android 不允许您在PACKAGE_USAGE_STATSACCESS_NETWORK_STATEREAD_PHONE_STATE用户授予权限之前访问数据。

NetworkStatsNetworkStatsManager的文档似乎没有提及有关数据历史的任何内容。

NetworkStatsManager 是这样获得的:

val networkStatsManager by lazy {
                context.getSystemService(Context.NETWORK_STATS_SERVICE) as NetworkStatsManager
}

并在此处获得 NetworkStats 对象:

                mobileDataNetworkStats = networkStatsManager.queryDetails(
                        ConnectivityManager.TYPE_MOBILE,
                        getSubscriberId(context, ConnectivityManager.TYPE_MOBILE),
                        from.time,
                        to.time)

这就是我迭代桶的方式

            val bucket: NetworkStats.Bucket = NetworkStats.Bucket()
            mobileDataNetworkStats.getNextBucket(bucket)

            var currentUsage = usagePerUid[bucket.uid]
            currentUsage = when (currentUsage) {
                null -> 0
                else -> currentUsage
            }

            currentUsage += bucket.rxBytes
            currentUsage += bucket.txBytes

            usagePerUid[bucket.uid] = currentUsage

那么是否可以通过queryDetailsquerySummary在安装日期之前(或从用户授予权限的日期之前)获取存储桶?

4

1 回答 1

0

是的,这是可能的。只需选择您想要的时间到 InternalStatManager

val summaryStats = networkStatManager!!.querySummary(
            networkType, subscriberId, startTime, endTime
        )
于 2021-02-18T12:43:58.213 回答