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.
- Android - ¿Lollipop Screen pinning funciona a través de múltiples actividades en la misma aplicación?
- ¿Qué hace TranslationZ realmente en Android?
- Error al listar archivos con Android Storage Access framework en Lollipop
- Activity.startLockTask () ocasionalmente lanza IllegalArgumentException
- ¿Debemos diseñar para Android L tema material todavía?
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();
- App fallando al seleccionar / Desplazar elementos en Spinner. (LG Mobile) (java.lang.IllegalStateException: Iteración ya iniciada)
- Estilo de un widget SearchView mediante la biblioteca de soporte v21
- El cuadro de diálogo de alerta de Android no está bien diseñado en Lollipop
- Cámara frontal Android Camera2
- Multi Redes en Lollipop
- Android Lollipop con material tema personalizado Logo no actúa como DrawerToggle
- Android 5.0: cómo cambiar el color de título de las aplicaciones recientes?
- RecyclerView enfrenta pequeños problemas
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; }
- ¿Cómo puedo personalizar el color y el texto del modo de acción?
- Eclipse Juno ADT plugin ruta NDK eliminado?