web-dev-qa-db-fra.com

Impossible d'obtenir le nom de l'activité de premier plan dans Android Lollipop 5.0 uniquement

J'utilise le code suivant pour obtenir le nom d'activité de l'application de premier plan dans la variable foregroundTaskPackageName . Cela fonctionne sur toutes les versions de système d'exploitation entre 4.1 à 4.4, mais ne fonctionne pas dans Android 5.0 Lollipop.

Quelqu'un peut-il aider avec ce qui a changé dans 5.0 Lollipop? Dans Lollipop - le texte que je récupère pour foregroundTaskPackageName est simplement "Launcher3". J'utilise l'émulateur Genymotion.

ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
RunningTaskInfo foregroundTaskInfo = am.getRunningTasks(1).get(0); // get
                                                                        // list
                                                                        // of
                                                                        // running
                                                                        // tasks
String foregroundTaskAppName = null;
String foregroundTaskPackageName = foregroundTaskInfo.topActivity
                .getPackageName();
21
user1406716

Vous devez utiliser la nouvelle UsageStatsManager et appeler sa méthode queryUsageStats pour obtenir l'historique des activités lancées . Veuillez noter que l'utilisateur devra fournir un accès à la statistique d'utilisation dans les paramètres de l'appareil dans Sécurité-> Applications avec accès à l'utilisation.

Liens:

UsageStatsManager documentation

queryUsageStats documentation de la méthode

9
Muzikant

Cela fonctionne pour moi sur Lollipop (21):

    ActivityManager manager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);

    List<ActivityManager.RunningAppProcessInfo> tasks = manager.getRunningAppProcesses();

    Log.i("current_app",tasks.get(0).processName);
29
Mert

vous pouvez utiliser le code ci-dessous et obtenir le nom actuel du package d'activité de premier plan.

 if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.Lollipop) {
        // intentionally using string value as Context.USAGE_STATS_SERVICE was
        // strangely only added in API 22 (Lollipop_MR1)
        @SuppressWarnings("WrongConstant")
        UsageStatsManager usm = (UsageStatsManager) getSystemService("usagestats");
        long time = System.currentTimeMillis();
        List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,
                        time - 1000 * 1000, time);
                if (appList != null && appList.size() > 0) {
                    SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
                    for (UsageStats usageStats : appList) {
                        mySortedMap.put(usageStats.getLastTimeUsed(),
                                usageStats);
                    }
                    if (mySortedMap != null && !mySortedMap.isEmpty()) {
                        currentApp = mySortedMap.get(
                                mySortedMap.lastKey()).getPackageName();
                    }
                }
    } else {
        ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> tasks = am
                        .getRunningAppProcesses();
                currentApp = tasks.get(0).processName;
    }

Ajoutez ces autorisations dans le fichier manifeste (la première concerne <API 21, la deuxième>> API 21).

<uses-permission Android:name="Android.permission.GET_TASKS" />
<uses-permission Android:name="Android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" />
7
Vishal Butani

getRunningTasks ()

Cette méthode était obsolète dans l'API de niveau 21. Comme dans Lollipop, cela Cette méthode n'est plus disponible pour les applications tierces: le fichier l'introduction de recents centrés sur le document signifie qu'il peut fuir personne informations à l'appelant. Pour la compatibilité ascendante, il restera toujours renvoyer un petit sous-ensemble de ses données: au moins les propres tâches de l'appelant, et éventuellement d'autres tâches, telles que la maison, dont on sait qu'elles ne le sont pas sensible.

5
Marcin Orlowski

un moyen disponible, mais pas le meilleur, consiste à utiliser l'accessibilité.

Déclarer un service d'accessibilité dans le fichier XML AndroidManifest

<service
            Android:name=".MyAccessibilityService"
            Android:label="@string/accessibility_service_label"
            Android:permission="Android.permission.BIND_ACCESSIBILITY_SERVICE" >
            <intent-filter>
                <action Android:name="Android.accessibilityservice.AccessibilityService" />
            </intent-filter>

            <meta-data
                Android:name="Android.accessibilityservice"
                Android:resource="@xml/accessibility_service_config" />
        </service>

accessibility_service_config.xml fichier

<accessibility-service xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:description="@string/accessibility_service_desc"
    Android:accessibilityEventTypes="typeAllMask"
    Android:accessibilityFlags="flagDefault|flagIncludeNotImportantViews"
    Android:accessibilityFeedbackType="feedbackSpoken"
    Android:notificationTimeout="100"
    Android:canRetrieveWindowContent="true"
/>

stocker le nom de l'activité lorsque l'état de la fenêtre a changé

public class MyAccessibilityService extends AccessibilityService{
    public static String sActivityName;
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        // TODO Auto-generated method stub
        if(event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED){
            Log.d("activitytest", "onAccessibilityEvent with window state changed");
            sActivityName = event.getClassName().toString();
        }
    }

    @Override
    public void onInterrupt() {
        // TODO Auto-generated method stub

    }

}

L'inconvénient est que vous devez permettre aux utilisateurs d'activer votre service d'accessibilité dans les paramètres.

2
gonglong

j'ai créé une classe qui utilise la commande /system/bin/toolbox pour identifier les processus, puis identifie les applications visibles.

ProcessManager.Java

2
Rukmal Dias

Essaye ça

public static boolean isForeground(Context context) {
    ActivityManager manager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningAppProcessInfo> tasks = manager.getRunningAppProcesses();
    if(tasks.isEmpty())
        return false;

    for (ActivityManager.RunningAppProcessInfo task : tasks) {
        if(context.getPackageName().equalsIgnoreCase(task.processName)){
            return task.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
        }
    }
    return false;
}
0
Beom Soo Joung