Как получить приложение и/или активность переднего плана?

Я работаю над пультом дистанционного управления для интеграции между устройствами Android TV и Smartthings Hub. Я хочу видеть, какое приложение активно (передний план, отображается пользователю).

Мое приложение представляет собой мягкую клавиатуру, поэтому оно работает как служба (служба метода ввода).

Я нашел следующий код и попробовал его:

ActivityManager.RunningAppProcessInfo result=null;
String pname = "process: ";
ActivityManager activityManager = (ActivityManager) ctx.getSystemService( Context.ACTIVITY_SERVICE );
List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();

Iterator <ActivityManager.RunningAppProcessInfo> i = appProcesses.iterator();

while(i.hasNext()){
    ActivityManager.RunningAppProcessInfo info = i.next();
    Log.d("LOG : " , info.processName);

    if (info.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND)
    {
         result=info;
         break;
    }
}

Но он не отображает никаких приложений. Если я уберу условие

"info.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND"

затем он отображает мое приложение (клавиатуру) как работающее приложение.

Таким образом, кажется, что это показывает только приложения или действия, которые являются частью моего приложения. Как я могу получить эту информацию для всей системы Android? Требуется ли разрешение?

Если это невозможно сделать с помощью обычного приложения и возможно только с некоторыми дополнительными разрешениями или функциями специальных возможностей, я готов использовать его, потому что приложение не является коммерческим и не будет распространяться, если какой-либо другой пользователь Smartthings не т просить об этом. Я просто не могу использовать рутированное устройство. Кроме этого я могу попробовать что угодно.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
293
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуй это :

public static boolean isAppStatus(Context context) {
    boolean isAppStatus = true;
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) {
        List<ActivityManager.RunningAppProcessInfo> runningProcesses = am.getRunningAppProcesses();
        for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) {
            if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                for (String activeProcess : processInfo.pkgList) {
                    if (activeProcess.equals(context.getPackageName())) {
                        isAppStatus = false;
                    }
                }
            }
        }
    } else {
        List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
        ComponentName componentInfo = taskInfo.get(0).topActivity;
        if (componentInfo.getPackageName().equals(context.getPackageName())) {
            isAppStatus = false;
        }
    }
    return isAppStatus;
}

это нужно, чтобы проверить, является ли мой процесс активным процессом, однако я пытаюсь получить текущий активный процесс. Во всяком случае, я изменил его так, чтобы он записывал «activeProcess» в цикле «for» в журнал. Но это ничего не показало. Фактически, это ожидаемый результат, потому что ваш код не сильно отличается от моего примера по вопросу. Я не понимаю, почему это не работает. Я вызываю его из службы, и контекст определяется в onCreate как "context=this;" . Это нормально ?

ilker Aktuna 03.06.2019 07:08
Ответ принят как подходящий

Это кажется невозможным, потому что Google ограничил эту функцию только системными приложениями. Есть много вводящих в заблуждение ответов о проблеме. К сожалению, в большинстве ответов предполагается, что мы хотим только проверить, находится ли наше приложение на переднем плане. Но, как описано в вопросе, проблема заключается в попытке получить имя активного приложения (не нашего приложения).

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