Использование UsageStatsManager для получения приложения переднего плана

Я пытаюсь использовать UsageStatsManager, чтобы получить приложение переднего плана на Nexus 5 с Marshmallow. Я помню, раньше это работало, но по какой-то причине я получаю пустые строки для имен пакетов / классов.

Вот моя реализация

public String[] getForegroundPackageNameClassNameByUsageStats() {
    String packageNameByUsageStats = null;
    String classByUsageStats = null;
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
        UsageStatsManager mUsageStatsManager = (UsageStatsManager)getSystemService("usagestats");                       
        final long INTERVAL = 1000;
        final long end = System.currentTimeMillis();
        final long begin = end - INTERVAL;
        final UsageEvents usageEvents = mUsageStatsManager.queryEvents(begin, end);
        while (usageEvents.hasNextEvent()) {
            UsageEvents.Event event = new UsageEvents.Event();
            usageEvents.getNextEvent(event);
            if (event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) {
                packageNameByUsageStats = event.getPackageName();
                classByUsageStats = event.getClassName();
                Log.d(TAG, "packageNameByUsageStats is" + packageNameByUsageStats + ", classByUsageStats is " + classByUsageStats);
            }
        }
    }
    return new String[]{packageNameByUsageStats,classByUsageStats};
}

По какой-то причине он не входит в цикл while, то есть useEvents.hasNextEvent() имеет значение false. Из-за этого он возвращает пустые имена пакетов / классов.

Есть идеи, что я делаю не так?

Благодарю.

2 ответа

Решение

Итак, я обнаружил, что как только я установил интервал в 10000 вместо 1000, он работает. Видимо, интервал 1 с слишком мал.

Я использую это сам. Я думаю, что статистика использования будет обновляться только тогда, когда приложение выходит на передний план. Так что, если приложение переднего плана вышло на передний план (и осталось) до вашей отметки времени 'begin', то вы не получите ее.:(

С другой стороны, когда вы используете давным-давно, вы получите гигантский список, где вам нужно только самое большое время, чтобы определить приложение переднего плана.

Поэтому я создаю 3 разных времени: 1 минуту назад, 1 час назад и 12 часов назад.

Когда я получаю пустой список в 1 мин, я повторяю запрос с 1 ч и так далее. Таким образом, я получаю передний план большую часть времени. Но я никогда не заставляю его работать ВСЕ время.

Я очень скучаю по старому способу просто спросить менеджера пакетов, какое приложение находится на переднем плане (до android 5), новый способ немного грязный.

Другие вопросы по тегам