Cześć,
tworzę aplikację digital wellbeing i potrzebuję wciągnąć rzetelne dane na temat czasu spędzanego przez użytkownika w różnych aplikacjach danego dnia i zwrócić wynik tej operacji w postaci mapy. Dla każdego dnia liczę czas od północy - jeżeli teraz jest 16.05.2023 13:35 to sumuję czas spędzony w różnych aplikacjach od 16.05.2023 00:00.
Obecnie próbuję rozwiązać ten problem za pomocą UsageStats (Api level 21) (doc. https://developer.android.com/reference/android/app/usage/UsageStats)
private void getAppUsageStats() { UsageStatsManager usageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
Calendar calendar = Calendar.getInstance();
long endTime = calendar.getTimeInMillis(); // current moment
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
long startTime = calendar.getTimeInMillis(); // start of the current day
List<UsageStats> usageStatsList = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, startTime, endTime);
Map<String, Long> usageMap = new HashMap<>();
for (UsageStats usageStats : usageStatsList) {
long timeInForeground = usageStats.getTotalTimeInForeground();
if (timeInForeground > 0) {
usageMap.put(usageStats.getPackageName(), timeInForeground);
}
}
Map<String, String> formattedUsageMap = formatUsageMap(usageMap);
System.out.println("Usage Map: " + formattedUsageMap);
displayUsageStats(formattedUsageMap);
}
Jednak problem z tym podejściem polega na niedokładności w obliczaniu czasu spędzonego w aplikacjach, gdy porównujemy użycie widoczne w aplikacji Digital Wellbeing https://play.google.com/store/apps/details?id=com.google.android. apps.wellbeing&hl=en_US&pli=1, co prawdopodobnie jest poprawne, biorąc pod uwagę czas, jaki spędzam w aplikacjach. Przełączenie na inne metody z interfejsu API UsageStats, takie jak getTotalTimeVisible() lub getTotalTimeForegroundServiceUsed() nie rozwiązuje tego problemu.
Dla przykładu - To jest mapa użytkowania z tej metody dotycząca mojego bieżącego wykorzystania aplikacji:
Mapa wykorzystania: {com.chess=0039, com.facebook.orca=0021, com.digitalwellbeingexperiments.toolkit.applist=0016, pl.mbank=0057, com.facebook.katana=0028, pl.ing.mojeing=0020, com.samsung.android.calendar=0042, com.android.chrome=0012, com.google.android.apps.docs.editors.sheets=0013, com.google.android.youtube=0050, }
A to jest rzeczywiste użycie w oparciu o aplikację Digital Wellbeing:
Youtube 1h 56 min
Chrome 25 min
Messenger 10 min
Facebook 1 min
Gmail 1 min
Wygląda więc na to, że moja metoda w jakiś sposób połączyła użytkowanie z tego dnia i poprzedniego dnia (ponieważ wczoraj grałem w szachy 13 min i używąłem mbank 10 min), ale nie powinna, ponieważ ustawiłem początek na północ obecnego dnia oraz dodatkowo kompletnie błędnie policzyła użycie Youtube
Proszę o każdą sugestię, będę bardzo wdzięczny ;)