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

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


person itsam    schedule 11.12.2018    source источник
comment
Отвечает ли это на ваш вопрос? Как я могу получить время экрана моего приложения на почасовой основе?   -  person Tanjim Khan    schedule 15.05.2020
comment
Да, это так. Метод, основанный на событиях, довольно точен и может использоваться для той же цели. Но актуальность userStatsManager остается и это нужно исправлять.   -  person itsam    schedule 26.05.2020


Ответы (2)


Я действительно испытываю аналогичную проблему:

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

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

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

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

person BBB    schedule 17.12.2018

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

  • Вам не хватает time.set(Calendar.SECOND,0) и time.set(Calendar.MILLISECOND,0)
  • Точность теряется в делении ft=value.totalTimeInForeground/60000

Я бы рекомендовал Java Time (ThreeTenBP) для обработки DateTime< /em> и Длительность точнее. Я создаю новую функцию для сравнения, и действительно результаты разные.

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 мин.

person Omar Mainegra    schedule 11.12.2018