Как получить статистику использования для "текущего дня", используя UseStatsManager в Android (Kotlin)

Задача:
Нужно получить статистику использования за сегодня (общее время, за которое устройство использовалось сегодня) т.е. 12.00 по текущему времени.

Проблема:
1. Я получаю сегодняшнее время + некоторое другое не объяснимое время
2.Не объяснимые метки времени (начало и конец статистики использования, полученной методами getTimestamp)
Время не имеет значения. Я указываю время начала как 12.00, а время окончания - как текущее время, но я получаю совершенно неактуальные значения ".firstTimeStamp" и ".lastTimeStamp" (которые предположительно возвращают начало и конец данных статистики использования) для статистики использования.

* уже выполнил часть предоставления разрешения, вот функция, которую я использую, чтобы получить общее время в минутах.

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.40, результат будет следующим:
(в textView):
ВЫ потратили 90 минут
(в textView2):
Вт 11 дек 16:23:19 GMT +05:30 2018
Вт 11 дек 19:38:45 GMT +05:30 2018

Как я могу использовать свой телефон в течение 90 минут всего за 40 минут?
И что означают эти, по-видимому, нерелевантные временные метки?
Я делаю что-то не так, чтобы достичь своей цели?

2 ответа

Я на самом деле испытываю похожую проблему:

Согласно моему пониманию документации firstTimeStamp а также lastTimeStamp должен дать "начало (конец) временного диапазона, который представляет этот UsageStats".

Однако они отличаются от того, что я привожу в качестве аргумента queryAndAggregateUsageStats как beginTime а также endTime,

Также результат для totalTimeInForegroundкажется, скорее вернуть результат за промежуток времени, заданный firstTimeStamp / lastTimeStamp чем для запрошенного.

Я заполнил ошибку в Google для этого, пожалуйста, посмотрите на https://issuetracker.google.com/issues/118564471.

Я заметил несколько проблем с вашим подходом.

  • Вам не хватает 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 минуты.

Другие вопросы по тегам