如何使用android(kotlin)中的usageStatsManager获取“当日”的使用情况统计信息

时间:2018-12-11 18:52:35

标签: android android-studio kotlin usagestatsmanager

目标:
需要获取今天的使用情况统计信息(今天使用该设备的总时间),即。当前时间是凌晨12点。

问题:
1.我得到今天的时间+其他无法解释的时间
2.不可解释的时间戳(通过getTimestamp方法检索的使用状态的开始和结束)
时间段无关紧要。我将开始时间定为凌晨12点,将结束时间定为当前时间,但是对于使用情况统计信息,我得到的是完全不相关的“ .firstTimeStamp”和“ .lastTimeStamp”(它们应该返回使用情况统计数据的开始和结束)。 / p>

*已经完成了权限授予部分,这是我用来获取总时间(以分钟为单位)的函数。

fun showtime(){

    val time=Calendar.getInstance()
    time.set(Calendar.HOUR_OF_DAY,0)
    time.set(Calendar.MINUTE,0)

    val start=time.timeInMillis
    val end= System.currentTimeMillis()

    val usageStatsManager = getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager
    var stats = usageStatsManager.queryAndAggregateUsageStats(start,end)

    var x:Long=0
    var ft:Long=0
    var v:Long=0
    var l:Long=0

    for ((key,value) in stats) {
        ft=value.totalTimeInForeground/60000
          textField1.append("$key = $ft mins")
            textField1.append("\n")
            x=x+ft
        v=value.firstTimeStamp
        l=value.lastTimeStamp
    }

    textView.setText("YOU SPENT $x mins.")
    textView2.setText("${Date(v)} to \n${Date(l)}")
}

例如,当以上代码在12月12日星期三12.40 am运行时,结果为:
(在textView中):
您花费90分钟
(在textView2中):
2018年12月11日星期二16:23:19 GMT +05:30到
2018年12月11日星期二19:38:45 GMT +05:30

如何在40分钟内使用手机90分钟?
那些显然无关紧要的时间戳意味着什么?
我在做错事以实现自己的目标吗?

2 个答案:

答案 0 :(得分:1)

我注意到您的方法存在一些问题。

  • 您缺少time.set(Calendar.SECOND,0)time.set(Calendar.MILLISECOND,0)
  • 精度在ft=value.totalTimeInForeground/60000部门中丢失

我建议Java Time (ThreeTenBP)更准确地处理 DateTime Duration 。我创建了一个新函数进行比较,实际上结果是不同的。

fun showtime2(){
    val start = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli()
    val end = ZonedDateTime.now().toInstant().toEpochMilli()

    val usageStatsManager = getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager
    val stats = usageStatsManager.queryAndAggregateUsageStats(start, end)

    val total = Duration.ofMillis(stats.values.map { it.totalTimeInForeground }.sum())
    println("YOU SPENT ${total.toMinutes()} mins.")
}

您的输出

您花费577分钟

我的输出

您花费582分钟。

答案 1 :(得分:1)

我实际上遇到了类似的问题:

根据我对文档firstTimeStamplastTimeStamp的理解,应给出“ UsageStats表示的时间范围的开始(结束)”。

但是,它们与我在queryAndAggregateUsageStats中作为beginTimeendTime的论点不同。

totalTimeInForeground / firstTimeStamp给出的时间间隔相比,lastTimeStamp的结果似乎要返回而不是所请求的结果。

我为此在Google上填补了一个错误,请查看https://issuetracker.google.com/issues/118564471