No se puede obtener el nombre de la actividad en primer plano en Android Lollipop 5.0

Utilizo el siguiente código para obtener el nombre de la actividad de la aplicación de primer plano en la variable foregroundTaskPackageName . Funciona en todas las versiones de SO entre 4.1 y 4.4, pero no funciona en Android 5.0 Lollipop.

¿Puede alguien ayudar con lo que ha cambiado en 5.0 Lollipop? En Lollipop – el texto que consigo para foregroundTaskPackageName es sólo 'Launcher3'. Estoy usando el Emulador 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(); 

UsageStatsManager utilizar el nuevo UsageStatsManager y llamar a su método queryUsageStats para obtener el historial de actividades iniciadas. Tenga en cuenta que al usuario se le requerirá que proporcione acceso a estadísticas de uso en la configuración del dispositivo en Seguridad-> Aplicaciones con acceso de uso.

Campo de golf:

Documentación de UsageStatsManager

queryUsageStats método queryUsageStats

Esto funciona para mí en Lollipop (21):

  ActivityManager manager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> tasks = manager.getRunningAppProcesses(); Log.i("current_app",tasks.get(0).processName); 

Puede usar el código debajo y obtener el nombre actual del paquete de actividades de primer plano.

  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; } 

Agregue estos permisos al archivo Manifest (el primero es para <API 21, el segundo para> = API 21).

 <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" /> 

GetRunningTasks ()

Este método fue obsoleto en el nivel 21 de la API. A partir de LOLLIPOP, este método ya no está disponible para aplicaciones de terceros : la introducción de documentos recientes centrados en documentos significa que puede transmitir información a la persona que llama. Para la compatibilidad hacia atrás, todavía devolverá un pequeño subconjunto de sus datos: por lo menos las tareas propias de la persona que llama y, posiblemente, otras tareas como la casa que se sabe que no son sensibles.

Una forma disponible, pero no la mejor, es utilizar la accesibilidad.

Declare un servicio de accesibilidad en el archivo xml de 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> 

Archivo accessibility_service_config.xml

 <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" /> 

Almacena el nombre de la actividad cuando se cambia el estado de la ventana

 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 } } 

La desventaja es que debe permitir que los usuarios habiliten su servicio de accesibilidad en Configuración.

He creado una clase que utiliza el comando /system/bin/toolbox para identificar los procesos y luego identifica la aplicación visible. Necesidad de agregar identifica las aplicaciones del sistema sin UI y lanzadores de Android.

ProcessManager.java

Prueba esto

 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; } 
  • Dibuja WebView en un lienzo en Android-L
  • Cómo implementar elementos expandibles con LinearLayoutManager (introducido con Android L)
  • Texto de contenido de notificación de Android no aparecerá en OS 4.4.4 Kitkat, pero se muestra en OS 5.0 Lollipop
  • ¿Cómo comunicarse entre las aplicaciones en el propietario del perfil y el dispositivo en android lollipop?
  • Lista de verificación de material de diseño: ocultar la barra de aplicaciones en el desplazamiento?
  • SetLayoutManager NullPointException en RecyclerView
  • No tengo una carpeta separada llamada valores v21
  • ¿Es posible mover una notificación de heads-up a la barra de estado?
  • ClassNotFoundException: No encontró la clase "android.os.PersistableBundle" Otto Android 5.0
  • Tablas de material de Android 5.0 con barra de herramientas
  • La barra de progreso de círculo indeterminado en android es blanca, a pesar de colorAccent color
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.