Android: получить активные имена приложений в активном сеансе

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

Сначала я попытался вывести текущее приложение на передний план. Я использую сервис в фоновом режиме и пробовал другой код:

AndroidManifest.xml:

    <uses-permission android:name="android.permission.GET_TASKS"/>

TaskListenerService.java:

        ActivityManager am = (ActivityManager) TaskListenerService.this.getSystemService(ACTIVITY_SERVICE);
    ActivityManager.RunningTaskInfo foregroundTaskInfo = am.getRunningTasks(1).get(0);
    String foregroundTaskPackageName = foregroundTaskInfo .topActivity.getPackageName();
    Toast.makeText(this, "name foregroundTaskInfo: " + foregroundTaskPackageName, Toast.LENGTH_SHORT).show();


    PackageManager pm = TaskListenerService.this.getPackageManager();
    PackageInfo foregroundAppPackageInfo = null;
    try {
        foregroundAppPackageInfo = pm.getPackageInfo(foregroundTaskPackageName, 0);
        String foregroundTaskAppName = foregroundAppPackageInfo.applicationInfo.loadLabel(pm).toString();
        Toast.makeText(this, "name foregroundTaskAppName: " + foregroundTaskAppName, Toast.LENGTH_SHORT).show();
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }

Он прекрасно работает в моем собственном приложении, но если другое приложение находится на переднем плане, я получаю в виде пакета просто "com.sec.android.app.launcher" ("TouchWiz-Start" как foregroundTaskAppName). Я также попробовал этот код в TaskListenerService.java с тем же результатом:

   ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
            List<ActivityManager.RunningAppProcessInfo> taskInfo = am.getRunningAppProcesses();

    for (ActivityManager.RunningAppProcessInfo task:taskInfo) {
        if (task.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND){
            Toast.makeText(this, "name: " + task.processName, Toast.LENGTH_SHORT).show();
        }
    }

И этот код...

   ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
    List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
    Log.d("topActivity", "CURRENT Activity ::" + taskInfo.get(0).topActivity.getClassName());
    ComponentName componentInfo = taskInfo.get(0).topActivity;
    componentInfo.getPackageName(); 
    Toast.makeText(this, "packageName: " + componentInfo.getPackageName(), Toast.LENGTH_LONG).show();

Мои вопросы:

  1. Есть ли другой способ решить мою проблему? Может быть, с другим подходом, чтобы получить все приложения в сеансе?
  2. Есть ли другое решение без использования GET_TASKS? (Устаревшее)

0 ответов

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