Как получить статистику использования для "текущего дня", используя 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 минуты.