Comment déterminer si une boîte de dialogue système est affichée?

Comment vérifier si une dialog système (comme celle ci-dessous ou USSD) s'affiche dans Android?

Dialogue de commutation de mode avion

Méthode programmable ou mode racine cmd? Toutes les variantes.

  • Comment désinstaller une application Android depuis la ligne de commande sur l'appareil
  • 3 Solutions collect form web for “Comment déterminer si une boîte de dialogue système est affichée?”

    Vous pouvez théoriquement faire cela en utilisant AccessibilityService , mais il est plutôt compliqué et peut ou non fonctionner sur différents appareils. Les utilisateurs devront activer manuellement les fonctionnalités d'accessibilité pour votre application. Vous pouvez obtenir des rappels depuis Android chaque fois qu'une fenêtre est ouverte et vous pouvez ensuite interroger la fenêtre pour déterminer si elle contient du texte spécifique ou appartient à un colis spécifique, etc. C'est une approche de "force brute", mais elle peut être utile Dans certaines situations.

    Une boîte de dialogue système est une activité. Vous pouvez le détecter par le nom de la classe d'activité supérieure à l'aide de ActivityManager .

     final ActivityManager manager = (ActivityManager) context .getSystemService(Activity.ACTIVITY_SERVICE); 

    Dans les périphériques avec un niveau API inférieur à 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 } 

    Dans les nouveaux périphériques:

     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 } 

    Dans ce cas, vous pouvez vérifier si l'appareil est en mode avion avant de commencer l'activité:

     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 } 

    Votre question m'a fait penser à une solution utilisée par la gestion des autorisations dans Android 6+. Avez-vous déjà vu le message d'erreur si une Toast ou une boîte de dialogue d'alerte du système s'ouvre lorsque vous essayez de définir des autorisations? Message Android "Screen Overlay Detected" si l'utilisateur tente d'accorder une autorisation lorsqu'une notification s'affiche

    La façon dont ils l'ont fait est de remplacer la méthode dispatchTouchEvent en Activity . Cela peut vérifier si quelque chose est «en cours» interceptant les événements tactiles. Vous pouvez utiliser votre activité spéciale comme classe de base pour toute activité de votre application que vous souhaitez détecter les superpositions.

      @Override public boolean dispatchTouchEvent(MotionEvent event) { mObscured = (event.getFlags() & MotionEvent.FLAG_WINDOW_IS_OBSCURED) != 0; return super.dispatchTouchEvent(event); } 

    Ajouter une méthode publique pour vérifier à tout moment si votre activité est obscurcie

     public boolean isObscured() { return mObscured; } 

    Vous devriez faire attention – car ce n'est pas clair à partir de la question – si une deuxième activité d'un système ou d'une application privilégiée se trouve à l'avant de la pile, votre propre activité ne recevra plus d'événements tactiles. Il s'agit de capturer les fragments, les toasts, les widgets flottants et d'autres éléments qui peuvent partager la hiérarchie des vues.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.