1

背景

我想要关于我公司平板电脑上不同应用程序的使用数据。最佳解决方案跨越的时间最长。我在这里读到,我应该能够通过一些 UsageStatsManager 查询获取长达两年的数据。

我试过的

我认为UsageStatsManager.queryAndAggregateUsageStats(..)可以解决问题,但我发现它最多只能返回一周左右的时间间隔。由于“聚合”查询不起作用,我尝试了这段代码,因此我可以显式声明存储桶大小:

val appStats = statsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY, 0, Long.MAX_VALUE)

我尝试使用多个不同的时间间隔,包括:

val appStats = statsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY,curTime - TimeUnit.DAYS.toMillis(730), curTime)

我能得到的最长间隔是一周左右。

示例日志:

Name: com.example.myusagestatsmanagertestapp
-->  Beginning: Tue Jul 20 10:16:41 CDT 2021
-->     Ending: Mon Jul 26 21:20:47 CDT 2021
--> Time in FG: 186

我现在在哪里

我一定是做错了什么,因为INTERVAL_YEARLY常量没有被弃用。但是,我从其他帖子(例如这篇文章或这篇文章)中推断出这个 API 是粗略的。

我的下一步是通过UsageStatsManager.queryEvents(..)构建我自己的统计数据,这看起来更加一致和清晰。

问题

  1. 问题是什么?
  2. UsageStatsManager 数据是否值得信任?

规格和代码

我的设备是 Android 9.0 Samsung Galaxy Active Tab2。

这是完整的功能!

    private fun getIndividualAppUsageDuration(
    statsManager: UsageStatsManager,
    curTime: Long
): Map<String, Long> {
    val appMap: MutableMap<String, Long> = mutableMapOf()

    val apps = statsManager.queryUsageStats(UsageStatsManager.INTERVAL_MONTHLY,curTime - TimeUnit.DAYS.toMillis(60), curTime)

    for(app in apps) {
        appMap[app.packageName] = app.totalTimeInForeground
        Log.d("TAG_1", "...\n" +
                "Name: ${app.packageName}\n" +
                "-->  Beginning: ${stringifyMilli(app.firstTimeStamp)}\n" +
                "-->     Ending: ${stringifyMilli(app.lastTimeStamp)}\n" +
                "--> Time in FG: ${TimeUnit.MILLISECONDS.toMinutes(app.totalTimeInForeground)}" )
    }

    return appMap
}

我使用的权限!

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

0 回答 0