Android UsageStatsManager производит неправильный вывод?
Я использую эту ссылку для создания состояний использования приложения. Мое понимание с выбранным интервалом заключается в том, что для YEARLY
интервал, он агрегирует данные для каждого YEAR
для каждой посылки между beginTime
а также endTime
продолжительность. Точно так же это должно работать для WEEKLY
а также DAILY
интервалы.
С WEEKLY
мой код и вывод приведены ниже;
Код:
Calendar beginCal = Calendar.getInstance();
beginCal.set(Calendar.DATE, 1);
beginCal.set(Calendar.MONTH, 0);
beginCal.set(Calendar.YEAR, 2012);
Calendar endCall = Calendar.getInstance();
endCall.set(Calendar.DATE, 1);
endCall.set(Calendar.MONTH, 0);
endCall.set(Calendar.YEAR, 2016);
final List<UsageStats> queryUsagesStats= mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_WEEKLY, beginCal.getTimeInMillis(), endCall.getTimeInMillis());
for(UsageStats us: queryUsagesStats)
{
long beginTime = us.getFirstTimeStamp();
String beginDate = df.format(new Date(beginTime));
long endTime = us.getLastTimeStamp();
String endDate = df.format(new Date(endTime));
String lastTime = df.format(new Date(us.getLastTimeUsed()));
long totalTimeInForeground = us.getTotalTimeInForeground()/1000L;
System.out.println("Pkg = " + us.getPackageName() + ", beginTime " + beginDate + ", endTime= " + endDate + ", lastTime = " + lastTime + ", totalTime = " + totalTimeInForeground);
}
выход:
Pkg = com.example.newappusagestatistics, beginTime 05/20/2015 17:00:04, endTime= 05/21/2015 17:55:42, lastTime = 05/21/2015 17:55:42, totalTime = 11186
Pkg = com.android.launcher, beginTime 05/20/2015 17:00:04, endTime= 05/21/2015 17:55:42, lastTime = 05/21/2015 17:55:42, totalTime = 1091
Pkg = com.android.browser, beginTime 05/20/2015 17:00:04, endTime= 05/21/2015 17:15:27, lastTime = 05/21/2015 17:15:27, totalTime = 68
Pkg = com.android.sdksetup, beginTime 05/20/2015 17:00:04, endTime= 01/01/1970 15:59:55, lastTime = 05/21/2015 14:41:08, totalTime = 1194
Pkg = com.android.camera, beginTime 05/20/2015 17:00:04, endTime= 01/01/1970 15:59:55, lastTime = 05/21/2015 14:55:32, totalTime = 40
Pkg = com.android.settings, beginTime 05/20/2015 17:00:04, endTime= 01/01/1970 15:59:55, lastTime = 05/21/2015 16:15:19, totalTime = 97
Pkg = com.android.systemui, beginTime 05/20/2015 17:00:04, endTime= 01/01/1970 15:59:55, lastTime = 05/21/2015 14:47:45, totalTime =
Однако, если я использую INTERVAL.DAILY
для приведенного выше кода я получаю только первые три строки. Мой интервал достаточно большой, чтобы он содержал все данные для всех пакетов между этим интервалом.
Pkg = com.example.newappusagestatistics, beginTime 05/21/2015 17:00:00, endTime= 05/21/2015 17:59:18, lastTime = 05/21/2015 17:59:18, totalTime = 3484
Pkg = com.android.launcher, beginTime 05/21/2015 17:00:00, endTime= 05/21/2015 17:59:18, lastTime = 05/21/2015 17:59:18, totalTime = 27
Pkg = com.android.browser, beginTime 05/21/2015 17:00:00, endTime= 05/21/2015 17:15:27, lastTime = 05/21/2015 17:15:27, totalTime = 43
Я делаю что-то не так или мое понимание совокупных интервалов неверно? Любая помощь будет оценена. Благодарю.
Edit1
Посмотрев в хранилище statsfile android в папке /data/system/usagestats, я нашел два файла для ежедневной статистики и один для еженедельной статистики, как показано ниже.
ежедневный файл1
<usagestats version="1" endTime="59366071">
<packages>
<package lastTimeActive="59366071" package="com.example.newappusagestatistics" timeActive="4064908" lastEvent="1"/>
<package lastTimeActive="59366020" package="com.android.launcher" timeActive="813728" lastEvent="2"/>
<package lastTimeActive="927475" package="com.android.browser" timeActive="43838" lastEvent="2"/>
</packages>
ежедневный файл2
<usagestats version="1" endTime="86395657">
<packages>
<package lastTimeActive="86395657" package="com.example.newappusagestatistics" timeActive="7916365" lastEvent="3" />
<package lastTimeActive="85743386" package="com.android.launcher" timeActive="1064651" lastEvent="2" />
<package lastTimeActive="78961499" package="com.android.browser" timeActive="24715" lastEvent="2" />
<package lastTimeActive="78063875" package="com.android.sdksetup" timeActive="1194161" lastEvent="3" />
<package lastTimeActive="78928555" package="com.android.camera" timeActive="40775" lastEvent="2" />
<package lastTimeActive="83715390" package="com.android.settings" timeActive="97012" lastEvent="2" />
<package lastTimeActive="78461328" package="com.android.systemui" timeActive="4162" lastEvent="2" />
</packages>
еженедельно
<usagestats version="1" endTime="145761729">
<packages>
<package lastTimeActive="145761729" package="com.example.newappusagestatistics" timeActive="11981273" lastEvent="1" />
<package lastTimeActive="145761678" package="com.android.launcher" timeActive="1878379" lastEvent="2" />
<package lastTimeActive="87323133" package="com.android.browser" timeActive="68553" lastEvent="2" />
<package lastTimeActive="78063875" package="com.android.sdksetup" timeActive="1194161" lastEvent="3" />
<package lastTimeActive="78928555" package="com.android.camera" timeActive="40775" lastEvent="2" />
<package lastTimeActive="83715390" package="com.android.settings" timeActive="97012" lastEvent="2" />
<package lastTimeActive="78461328" package="com.android.systemui" timeActive="4162" lastEvent="2" />
</packages>
Все эти данные, похоже, испорчены. Для одного и того же приложения браузера ежедневно хранятся разные результаты, а еженедельно - разные.
2 ответа
Согласно документации релиза Google.
( https://developer.android.com/about/versions/android-5.0.html)
Система собирает данные об использовании для каждого отдельного приложения, объединяя данные за ежедневные, еженедельные, ежемесячные и годовые интервалы. Максимальная длительность хранения этих данных следующая:
Ежедневные данные: 7 дней
Еженедельные данные: 4 недели
Ежемесячные данные: 6 месяцев
Годовые данные: 2 года
Если вы хотите получать статистику за период старше 7 дней, измените интервал времени с INTERVAL_DAILY на INTERVAL_WEEKLY или INTERVAL_YEARLY. здесь более подробно о том же.
https://developer.android.com/reference/android/app/usage/UsageStatsManager.html
Это, вероятно, испорчено. Вы не можете доверять результату queryUsageStats.
В моем случае, ссылаясь
queryUsageStats(UsageStatsManager.INTERVAL_DAILY, 0, today)
показывает результаты за последние семь дней и вызывает
queryUsageStats(UsageStatsManager.INTERVAL_DAILY, few-days-ago, today)
показывает только результаты за сегодня. несколько дней назад и сегодня - это время в миллисекундах для указанного дня. Проверка результатов на сегодня показывает, что использование определенного приложения отсутствует, в то время как другие приложения, используемые позже сегодня, присутствуют.