Als ich zum ersten Mal seit einiger Zeit wieder Android-Code schrieb, stieß ich auf den Versuch, die Ansicht anderer Apps zu überlagern, und machte mir eine Notiz. Da nur die Hauptpunkte extrahiert werden, finden Sie detaillierten Code unter dem als Referenzseite aufgeführten Link.
AndroidManifest.xml
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
Übergeben Sie `WindowManager.LayoutParams.TYPE_SYSTEM_ALERT``` an den Layertyp (`
int _type``` Variable des Konstruktors), wenn LayoutParams generiert wird.
Referenzseite: Anwendungsinformationen immer auf dem Bildschirm anzeigen
Zusätzlich zur Unterstützung von Android 5.0 ist die folgende Unterstützung erforderlich.
Die API wurde aktualisiert, sodass einige Berechtigungen vom Benutzer individuell benötigt werden.
Rufen Sie zuerst `` `Settings # canDrawOverlays``` auf, um die Berechtigungen der App zu überprüfen.
Wenn Sie nicht über die Berechtigung verfügen, rufen Sie den Bildschirm auf, um die Überlagerungsberechtigung zu ändern. Geben Sie für Intent `` `Settings.ACTION_MANAGE_OVERLAY_PERMISSION``` und den Paketnamen Ihrer eigenen Anwendung an. (Zeigen Sie es dem Benutzer an und bitten Sie ihn, die Berechtigungseinstellung zu Beginn der Verwendung zuzulassen.)
Wenn die Steuerung über den Bildschirm mit den Berechtigungseinstellungen zu Ihrer App zurückkehrt, überprüfen Sie die Berechtigung erneut. Wenn die Berechtigung aktiviert ist, fügen Sie die Ansicht auf die gleiche Weise wie bis zu Android 5.0 hinzu.
Referenzseite: Die Behandlung von SYSTEM_ALERT_WINDOW-Berechtigungen wurde in Marshmallow geändert
Zusätzlich zur Unterstützung bis Android 7.1.1 ist die folgende Unterstützung erforderlich.
Die API wurde aktualisiert und die Ebene TYPE_SYSTEM_ALERT ist nicht mehr verfügbar. Daher führt die Verwendung desselben Layertyps "WindowManager.LayoutParams.TYPE_SYSTEM_ALERT" zu einem Fehler. (Die folgende Ausnahme tritt auf. Ich hatte Probleme, weil ich bei der Suche mit dieser Ausnahme keine Informationen finden konnte.)
java.lang.RuntimeException: Unable to start service com.example.app.TestService@57b8b88 with Intent { cmp=com.example.app/.TestService }: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@4938b2b -- permission denied for window type 2003
Um dies zu vermeiden, übergeben Sie `` `WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY``` an den Ebenentyp, wenn Sie LayoutParams erstellen, wenn die API-Ebene 26 oder höher ist.
Referenzseite: [Das Verhalten von WindowManager ändert sich mit Android O](http://keithyokoma.hatenablog.com/entry/2017/03/22/190000)
Recommended Posts