web-dev-qa-db-fra.com

Comment obtenir des tâches récentes sur Android "L"?

Contexte

Mon application permet de trier une liste d'applications au moment où elles ont été récemment lancées.

Le problème

À partir de Android "L", la fonction getRecentTasks renverra simplement la liste des les applications que l'application actuelle a lancées, comme indiqué dans la documentation :

Si votre application utilise ActivityManager.getRecentTasks () ...

Avec l'introduction de la nouvelle fonctionnalité de tâches et de documents simultanés dans la prochaine version (voir la section Documents et activités simultanés dans l'écran Récents ci-dessous), la méthode ActivityManager.getRecentTasks () est désormais déconseillée pour améliorer la confidentialité des utilisateurs. Pour des raisons de compatibilité descendante, cette méthode renvoie toujours un petit sous-ensemble de ses données, y compris les propres tâches de l'application appelante et éventuellement d'autres tâches non sensibles (telles que la page d'accueil). Si votre application utilise cette méthode pour récupérer ses propres tâches, utilisez plutôt Android.app.ActivityManager.getAppTasks () pour récupérer ces informations.

La même chose est écrite lors de l'utilisation d'ADT pour afficher la documentation de cette fonction (non disponible actuellement sur Internet):

Cette méthode est obsolète. Depuis L, cette méthode n'est plus disponible pour les applications tierces: comme l'introduction de recents centrés sur les documents signifie qu'elle peut divulguer des informations personnelles à l'appelant. Pour des raisons de compatibilité ascendante, il renverra toujours un petit sous-ensemble de ses données: au moins les propres tâches de l'appelant (bien que voir getAppTasks () pour la façon correcte prise en charge de récupérer ces informations), et éventuellement d'autres tâches telles que la maison qui sont connues de ne soyez pas sensible.

Je ne comprends pas pourquoi cet acte a été pris, car il est facile de voir quelles applications l'utilisateur a, et même sans autorisation.

Le fait est que c'est une grosse restriction pour cette fonctionnalité que j'ai ajoutée, donc j'espère qu'il y a un moyen de surmonter cela.

Ce que j'ai essayé

Pour l'instant, je n'ai utilisé qu'une méthode heuristique pour savoir quelles applications ont été récemment lancées - j'obtiens plutôt la liste des processus en cours d'exécution.

Je pourrais également utiliser la valeur d'importance des processus et peut-être le "importanceReasonComponent", mais ce ne sont que des heuristiques et des suppositions ...

La question

Existe-t-il un moyen de surmonter cette restriction? Une solution à laquelle je n'ai pas pensé?

Peut-être que c'est possible avec root? Ou BusyBox?

23
android developer

Pour obtenir le nom du package supérieur (premier plan) en cours d'exécution, vous devez utiliser l'API Statistiques d'utilisation dans Android Lollipop.

Mais notez que l'utilisateur doit approuver l'accès aux données d'utilisation dans les paramètres de chaque application. Vous devez donc inviter l'utilisateur directement au paramètre en lançant l'action de paramétrage avec

Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);

Pour obtenir le nom de pack supérieur:

String topPackageName ;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) { 
    UsageStatsManager mUsageStatsManager = (UsageStatsManager)getSystemService("usagestats");                       
    long time = System.currentTimeMillis(); 
    // We get usage stats for the last 10 seconds
    List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000*10, time);                                    
    // Sort the stats by the last time used
    if(stats != null) {
        SortedMap<Long,UsageStats> mySortedMap = new TreeMap<Long,UsageStats>();
        for (UsageStats usageStats : stats) {
            mySortedMap.put(usageStats.getLastTimeUsed(),usageStats);
        }                    
        if(!mySortedMap.isEmpty()) {
            topPackageName =  mySortedMap.get(mySortedMap.lastKey()).getPackageName();                                   
        }                                       
    }
}
34
user3742392

Si vous utilisez UsageStats pour obtenir le package de premier plan actuel, vous obtiendrez des informations erronées lorsque l'utilisateur ouvrira le tiroir de notification ou sur un écran verrouillé. (testé sur les deux Android Lollipop et Marshmallow)

Vous devez utiliser UsageStatsManager.queryEvents () et rechercher le dernier événement avec le type d'événement MOVE_TO_FOREGROUND pour décider du package de premier plan actuel.

6
Sam Lu

La réponse @ user3742392 est bonne, mais l'utilisation d'un TreeMap pour trouver la dernière fois utilisée est un peu exagéré (surtout si vous voulez vérifier périodiquement la meilleure application en cours d'exécution).

Voici la réponse éditée sans TreeMap avec boucle simple à la place:

String topPackageName;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
    UsageStatsManager mUsageStatsManager = (UsageStatsManager) getSystemService("usagestats");
    long currentTime = System.currentTimeMillis();
    // get usage stats for the last 10 seconds
    List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, currentTime - 1000 * 10, currentTime);
    // search for app with most recent last used time
    if (stats != null) {
        long lastUsedAppTime = 0;
        for (UsageStats usageStats : stats) {
            if (usageStats.getLastTimeUsed() > lastUsedAppTime) {
                topPackageName = usageStats.getPackageName();
                lastUsedAppTime = usageStats.getLastTimeUsed();
            }
        }
    }
}
2
stevo.mit

Lollipop a déconseillé la méthode; cependant, il existe une nouvelle API qui vous permet de visualiser l'utilisation de l'application. La méthode a été déconseillée en raison de problèmes de sécurité. : \

UsageStatsManager a quelques méthodes utiles pour voir l'activité entre un intervalle de temps. J'espère que cela suffira à vos besoins!

https://developer.Android.com/reference/Android/app/usage/package-summary.html

1
Atish