背景
我想要关于我公司平板电脑上不同应用程序的使用数据。最佳解决方案跨越的时间最长。我在这里读到,我应该能够通过一些 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(..)构建我自己的统计数据,这看起来更加一致和清晰。
问题
- 问题是什么?
- 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" />