Android 5.1.1 и выше - getRunningAppProcesses () возвращает только мой пакет приложения

Похоже, Google наконец закрыл все двери для получения текущего пакета приложений переднего плана.

После обновления Lollipop, которое убилоgetRunningTasks(int maxNum) и благодаряэтот ответЯ использовал этот код для получения пакета приложения переднего плана начиная с Lollipop:

final int PROCESS_STATE_TOP = 2;
RunningAppProcessInfo currentInfo = null;
Field field = null;
try {
    field = RunningAppProcessInfo.class.getDeclaredField("processState");
} catch (Exception ignored) { 
}
ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appList = am.getRunningAppProcesses();
for (RunningAppProcessInfo app : appList) {
    if (app.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND &&
        app.importanceReasonCode == 0 ) {
        Integer state = null;
        try {
            state = field.getInt( app );
        } catch (Exception ignored) {
        }
        if (state != null && state == PROCESS_STATE_TOP) {
            currentInfo = app;
            break;
        }
    }
}
return currentInfo;

Android 5.1.1 и выше (6.0 Marshmallow), похоже, убитgetRunningAppProcesses() также. Теперь он возвращает список вашего собственного пакета приложения.

UsageStatsManager

Мы можем использовать новыйUsageStatsManager API какописано здесь но это не работает для всех приложений. Некоторые системные приложения возвращают один и тот же пакет

com.google.android.googlequicksearchbox

AccessibilityService (Декабрь 2017 г .: будет запрещен к использованию Google)

Некоторые приложения используютAccessibilityService (каквидел здесь) но у него есть некоторые недостатки.

Есть ли другой способ получить текущий запущенный пакет приложения?

Ответы на вопрос(7)

Ваш ответ на вопрос