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 ;)