Detección de la superposición de pantalla: cómo manejar esto en una aplicación de superposición de pantalla

Algunos dispositivos tienen funciones de seguridad adicionales y comprueban si una aplicación se está dibujando encima de otras, al mostrar un diálogo de permisos.

Tengo una aplicación de barra lateral, y mi aplicación tiene que estar deshabilitada, antes de que los usuarios puedan aceptar un diálogo del sistema.

Preguntas

  • ¿Cómo se supone que debo manejar este caso?
  • ¿Hay una manera de escuchar un evento "System dialog shown", para que pueda eliminar mi barra lateral y un "diálogo de sistema terminado" para que yo sepa, puedo continuar con mi superposición de barra lateral? Sé, que es suficiente para detener el servicio (no tienes que eliminar el permiso), por lo que esta sería una solución así

EDITAR

Una solución que se me ocurre es la siguiente:

Uso del AccessibilityService para comprobar aplicaciones / vistas de primer plano actuales. Allí podré comprobar los eventos que me muestran las actividades actuales de primer plano e incluso las vistas …

Mis problemas:

  • No sé cómo identificar un diálogo de permisos allí.
  • En segundo lugar, esto me obliga a pedir al usuario para obtener este permiso (que quiero evitar, pero tener una solución con este servicio, ya sería una mejora para mí, porque algunos usuarios dan este permiso a mi aplicación ya – Preguntar a todos entonces y explicar la razón, que es algo con lo que puedo vivir).

Por lo que sé, lo que quieres no es posible. En una pregunta similar, hay una solución para detectar los diálogos del sistema, pero no creo que funcione para su superposición (sólo para la actividad actualmente activa).

Otra pregunta sugiere que puede ser posible monitorear los diálogos del sistema a través de la clase ActivityManager , pero que la API ha sido obsoleta desde LOLIPOP.

Por estas razones, le sugiero que agregue un botón de pausa a su superposición. O incluso mejor, utilice una notificación pegajosa con los botones de parada / inicio para que los usuarios puedan pausar manualmente la superposición.


Para identificar las aplicaciones del sistema, necesita el nombre del paquete como se explica en esta respuesta :

 public boolean isSystemApp(String packageName) { try { // Get packageinfo for target application PackageInfo targetPkgInfo = mPackageManager.getPackageInfo( packageName, PackageManager.GET_SIGNATURES); // Get packageinfo for system package PackageInfo sys = mPackageManager.getPackageInfo( "android", PackageManager.GET_SIGNATURES); // Match both packageinfo for there signatures return (targetPkgInfo != null && targetPkgInfo.signatures != null && sys.signatures[0] .equals(targetPkgInfo.signatures[0])); } catch (PackageManager.NameNotFoundException e) { return false; } } 
  • Implementación de un mapa interior
  • Superposición de imagen en dos filas en una vista de lista
  • Android Crear imagen "Ghost" (Touch-through)
  • ¿Cómo almacenar en caché android.graphics.path o Bitmap cuando se usan Overlays?
  • Android: Si los marcadores se superponen entre sí en el mapa, el evento de clic se disparará para el último escondido
  • El desplazamiento y el zoom de MapView es lento después de agregar muchas superposiciones
  • Android: Combina dos vistas de imagen superpuestas en un bmp con la posición correcta
  • Barra de navegación de Android superpuesta a mi vista
  • Android: configuración del relleno en un fondo de imagen de superposición
  • Cómo actualizar dinámicamente un elemento de superposición específico
  • Android - vistas de servicio
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.