¿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?

Diálogo de conmutación de modo avión

¿Manera programática o manera de la raíz del cmd? Cualquier variante.

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.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.