Похоже, 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
Мы можем использовать новый API UsageStatsManager
как описано здесь, но он работает не для всех приложений. Некоторые системные приложения возвращают один и тот же пакет
com.google.android.googlequicksearchbox
AccessibilityService (декабрь 2017: запрет на использование Google)
Некоторые приложения используют AccessibilityService
(как показано здесь), но у него есть некоторые недостатки.
Есть ли другой способ получить текущий запущенный пакет приложения?