Я работаю над пультом дистанционного управления для интеграции между устройствами 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 не т просить об этом. Я просто не могу использовать рутированное устройство. Кроме этого я могу попробовать что угодно.




Попробуй это :
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;
}
Это кажется невозможным, потому что Google ограничил эту функцию только системными приложениями. Есть много вводящих в заблуждение ответов о проблеме. К сожалению, в большинстве ответов предполагается, что мы хотим только проверить, находится ли наше приложение на переднем плане. Но, как описано в вопросе, проблема заключается в попытке получить имя активного приложения (не нашего приложения).
это нужно, чтобы проверить, является ли мой процесс активным процессом, однако я пытаюсь получить текущий активный процесс. Во всяком случае, я изменил его так, чтобы он записывал «activeProcess» в цикле «for» в журнал. Но это ничего не показало. Фактически, это ожидаемый результат, потому что ваш код не сильно отличается от моего примера по вопросу. Я не понимаю, почему это не работает. Я вызываю его из службы, и контекст определяется в onCreate как "context=this;" . Это нормально ?