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();
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:
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);
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" />
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.
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.
j'ai créé une classe qui utilise la commande /system/bin/toolbox
pour identifier les processus, puis identifie les applications visibles.
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;
}