微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 UsageStatsManager.queryUsageStats(...)?

如何解决如何使用 UsageStatsManager.queryUsageStats(...)?

背景

我想要有关我公司平板电脑上不同应用的使用数据。最佳解决方案跨越最多的时间。我读到 here 说我应该能够通过一些 UsageStatsManager 查询获取过去两年的数据。

我尝试过的

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

val appStats = statsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY,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 常量没有被弃用。但是,我从其他帖子(例如 this one 或 this one)中推断出此 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" />

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。