2016-07-31 27 views
10

Einige Geräte verfügen über zusätzliche Sicherheitsfunktionen und prüfen, ob eine App über andere Objekte zeigt, wenn ein Berechtigungsdialogfeld angezeigt wird.Bildschirm-Overlay erkannt - So umgehen Sie dies in einer Bildschirm-Overlay-App

Ich habe eine Sidebar-App, und meine App muss deaktiviert werden, bevor Benutzer einen Systemdialog akzeptieren können.

Fragen

  • Wie soll ich diesen Fall behandeln?
  • Gibt es eine Möglichkeit, nach einem Ereignis "Systemdialog gezeigt" zu sehen, damit ich meine Seitenleiste entfernen und ein "Systemdialog beendet", so dass ich weiß, kann ich mit meiner Sidebar-Overlay weitermachen? Ich weiß, dass es genug, um den Dienst zu beenden (Sie müssen nicht die Erlaubnis entfernen), so würde dies auch

EDIT

Eine Lösung Ich kann eine Lösung sein, denkt ist folgendes:

Verwenden Sie die AccessibilityService, um aktuelle Vordergrund Apps/Ansichten zu überprüfen. Es kann ich Ereignisse überprüfen, die mir aktuelle Vordergrund Aktivitäten zeigen und sogar Blick ...

Meine Probleme:

  • Ich weiß nicht, wie man eine Erlaubnis dort Dialog zu identifizieren.
  • Zweitens zwingt mich, den Benutzer zu bitten, diese Erlaubnis zu bekommen (die ich vermeiden möchte, aber eine Lösung mit diesem Service zu haben, wäre schon eine Verbesserung für mich, weil einige Benutzer diese Erlaubnis meiner App bereits geben) Ich müsste dann alles fragen und den Grund erklären, mit dem ich leben kann).

Antwort

0

Soweit ich weiß, was Sie wollen, ist nicht möglich. In einer ähnlichen question gibt es eine Lösung, Systemdialoge zu erkennen, aber ich denke nicht, dass es für Ihr Overlay (nur für die gerade aktive Aktivität) funktioniert.

Eine andere question schlägt vor, dass es möglich sein kann, Systemdialoge über die ActivityManager Klasse zu überwachen, aber diese API ist seit LOLIPOP veraltet.

Aus diesen Gründen empfehle ich Ihnen, eine Pause-Schaltfläche zu Ihrem Overlay hinzuzufügen. Oder noch besser, Verwenden Sie einen sticky notification mit Stop/Start-Tasten, damit Benutzer Ihr Overlay manuell anhalten können.


Um System-Apps zu identifizieren, können Sie den Paketnamen in this answer wie erklärt brauchen:

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; 
    } 
} 
+0

Ich werde die Links überprüfen ... Meine App selbst schon manchmal macht eine Pause, wenn einige Benutzer der schwarzen Liste ausgewählt Apps stehen im Vordergrund, also beobachte ich dies über 'ActivityManager' (oder den neueren' AccessibilityService') sowieso schon ... Ich dachte, es könnte zumindest eine Lösung mit dem 'AccessibilityService' geben ... – prom85

+0

@ prom85 Ja, es möglicherweise auch mit [AccessibilityService # getWindows()] (https://developer.android.com/reference/android/accessi bilityservice/ErreichbarkeitService.html # getWindows()), die der Dokumentation alle angezeigten Fenster zurückgibt. – Manu

+0

Ich habe bereits eine Pause/Fortsetzen-Taste in der Benachrichtigung ... Und die aktuelle Vordergrund App/Ansicht ist kein Problem, noch, ich weiß nicht, wie Systemfenster zu identifizieren ... Ich habe einige zusätzliche Infos zu hinzufügen meine Frage bezogen sich auf die 'AccessibilityService'-Lösung ... – prom85