¿Cómo determinar si se muestra cualquier diálogo del sistema?
¿Cómo comprobar si algún dialog
sistema (como el que se muestra debajo o USSD) se muestra en Android?
- Android - FileExplorer eclipse como root
- ¿Cómo cambiar el Modo de Avión en Android 4.2 o superior usando root?
- ¿Es posible ejecutar un binario de brazo nativo en un teléfono Android no enraizado?
- Un comando de terminal para un Android enraizado para volver a montar / Sistema como lectura / escritura
- Android - mount: Sistema de archivos de sólo lectura
¿Manera programática o manera de la raíz del cmd? Cualquier variante.
- Fije la posición del ratón en el dispositivo androide arraigado
- Desactivación de la raíz de Android
- Acceso root con java.io.file en Android
- ¿Cómo ejecutar adb push como root?
- Utilice la biblioteca de RootTools de android para obtener permiso android.permission.STATUS_BAR
- ¿Cómo desbloqueo programaticamente la pantalla en el dispositivo con raíz?
Teóricamente puedes hacer esto utilizando AccessibilityService
, pero es bastante complicado y puede o no funcionar en diferentes dispositivos. Los usuarios tendrán que activar manualmente las características de accesibilidad para su aplicación. Usted puede obtener devoluciones de llamada de Android cada vez que se abre cualquier ventana y luego se puede interrogar la ventana para determinar si tiene texto específico en él o pertenece a un paquete específico, etc Este es un enfoque de "fuerza bruta", pero puede ser útil En algunas situaciones.
Un diálogo del sistema es una actividad. Puede detectarlo por el nombre de la clase de actividad superior mediante ActivityManager .
final ActivityManager manager = (ActivityManager) context .getSystemService(Activity.ACTIVITY_SERVICE);
En dispositivos con nivel de API inferior a 23 (M):
final List<ActivityManager.RunningTaskInfo> runningTasks = manager.getRunningTasks(1); final ComponentName componentName = runningTasks.get(0).topActivity; final String className = componentName.getClassName(); if (className.equals("YOUR_EXPECTED_ACTIVITY_CLASS_NAME")) { // do something }
En los dispositivos más nuevos:
final List<ActivityManager.AppTask> appTasks = manager.getAppTasks(); final ComponentName componentName = appTasks.get(0).getTaskInfo().topActivity; final String className = componentName.getClassName(); if (className.equals("YOUR_EXPECTED_ACTIVITY_CLASS_NAME")) { // do something }
O en este caso, puede comprobar si el dispositivo está en modo avión antes de iniciar la actividad:
private boolean isAirplaneModeOn(final Context context) { final int airplaneMode = Settings.System.getInt( context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0 ); return airplaneMode != 0; } ... if (!isAirplaneModeOn(this)) { // do something }
Su pregunta me hizo pensar en una solución en uso por la administración de permisos en Android 6+. ¿Alguna vez ha visto el mensaje de error si se abre un cuadro de diálogo de Toast o de sistema al intentar establecer permisos? Android "Pantalla superpuesta detectada" mensaje si el usuario está tratando de conceder un permiso cuando una notificación se muestra
La forma en que lo hizo fue sustituyendo el método dispatchTouchEvent
en Activity
. Esto puede comprobar si algo está "en el camino" interceptar eventos táctiles. Puede usar su Actividad especial como clase base para cualquier Actividad en su aplicación que desee detectar cualquier superposición en ella.
@Override public boolean dispatchTouchEvent(MotionEvent event) { mObscured = (event.getFlags() & MotionEvent.FLAG_WINDOW_IS_OBSCURED) != 0; return super.dispatchTouchEvent(event); }
Agregue un método público para comprobar en cualquier momento si su actividad está oscurecida
public boolean isObscured() { return mObscured; }
Debe tener cuidado -como no queda claro en la pregunta- si una segunda Actividad de un sistema o aplicación privilegiada está en la parte delantera de la pila, entonces su propia actividad ya no estará recibiendo eventos táctiles. Esto es para capturar los fragmentos, tostadas, widgets flotantes y otros elementos que pueden compartir la jerarquía de vista.