Wie kann festgestellt werden, ob ein Systemdialog angezeigt wird?

Wie kann man überprüfen, ob ein Systemdialog (wie der unten oder USSD) in Android angezeigt wird?

Flugzeugmodus-Umschaltdialog

  • Fragmente werden nicht immer ersetzt, wenn die Rücktaste verwendet wird
  • Blättern Sie zu / setzen Sie die Position der benutzerdefinierten Listenpräferenz
  • So speichern Sie Daten von meiner App
  • Wie Emulator für ONEPLUS ZWEI zu schaffen?
  • Wie man den Alarm zurücksetzt, wenn die App in Androide geschlossen ist
  • Android oder Java-Klasse benennen mit $ symbol
  • Programmatische Weise oder cmd Wurzel Weg? Beliebige Varianten.

  • Gibt es einen Grund, Google GCM vs Apple Messaging für Push-Benachrichtigungen zu verwenden?
  • NullPointerException Zugriff auf Ansichten in onCreate ()
  • Wie lese ich / sende Daten mit der Android-Geräte 3.5mm Headset-Buchse?
  • Android-Komponenten für die Anzeige eines Graphen (Knoten und Kanten, in 2D)?
  • So fügen Sie eine Floating-Ansicht zu Android Window Manager und hören Sie System / Hardware Back-Button-Ereignisse
  • Android ListView in der Aktivität, die auf die Änderung der Ausrichtung aktualisiert wird
  • 3 Solutions collect form web for “Wie kann festgestellt werden, ob ein Systemdialog angezeigt wird?”

    Sie können dies theoretisch mit dem AccessibilityService tun, aber es ist ziemlich kompliziert und kann oder funktioniert nicht auf verschiedenen Geräten. Benutzer müssen die Zugriffsfunktionen für Ihre Anwendung manuell aktivieren. Sie können Rückrufe von Android erhalten, wenn ein Fenster geöffnet ist und Sie können dann das Fenster abfragen, um festzustellen, ob es bestimmten Text in ihm hat oder gehört zu einem bestimmten Paket, etc. Dies ist ein "Brute-Force" -Ansatz, aber es kann nützlich sein In einigen Situationen.

    Ein Systemdialog ist eine Aktivität. Sie können es mit dem Top-Aktivitätsklassennamen mit ActivityManager erkennen .

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

    Bei Geräten mit API Level unter 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 } 

    Bei neueren Geräten:

     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 } 

    Oder in diesem Fall können Sie überprüfen, ob das Gerät im Flugzeugmodus ist, bevor Sie die Aktivität starten:

     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 } 

    Ihre Frage ließ mich an eine Lösung im Gebrauch durch das Berechtigungsmanagement in Android 6+ denken. Hast du jemals die Fehlermeldung gesehen, wenn ein Toast- oder Systemalarm-Dialog beim Öffnen von Berechtigungen geöffnet wird? Android "Screen Overlay Detected" -Nachricht, wenn der Benutzer versucht, eine Berechtigung zu erteilen, wenn eine Benachrichtigung angezeigt wird

    Die Art, wie sie es taten, ist, indem sie die Methode dispatchTouchEvent in Activity überschreibt. Dies kann überprüfen, ob irgendetwas "im Weg" ist, um Berührungsereignisse abzufangen. Sie können Ihre spezielle Aktivität als Basisklasse für jede Aktivität in Ihrer App verwenden, die Sie irgendwelche Overlays darauf erkennen möchten.

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

    Fügen Sie eine öffentliche Methode hinzu, um zu einem bestimmten Zeitpunkt zu überprüfen, ob Ihre Aktivität verdeckt ist

     public boolean isObscured() { return mObscured; } 

    Sie sollten vorsichtig sein – wie es aus der Frage nicht klar ist – wenn eine zweite Aktivität von einem System oder einer privilegierten App an der Vorderseite des Stapels liegt, dann wird Ihre eigene Aktivität nicht mehr Berührungsereignisse erhalten. Dies ist, um die Fragmente, Toasts, schwimmende Widgets und andere Elemente, die die Ansicht Hierarchie teilen können, zu erfassen.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.