Как получить статистику использования для "текущего дня", используя UseStatsManager в Android (Kotlin) - PullRequest
0 голосов
/ 11 декабря 2018

Цель:
Требуется получить статистику использования за сегодня (общее время, в течение которого устройство использовалось сегодня), т.е.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 ]

0 голосов
/ 17 декабря 2018

На самом деле я сталкиваюсь с подобной проблемой:

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

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

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

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

0 голосов
/ 12 декабря 2018

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

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

...