Ich habe diesen Beitrag zum Beispiel bevorzugt, aber ich habe den Fehler beim Hinzufügen einer Ansichtsgruppe zum Windowmanager-Objekt erhalten. Ich habe dieselbe Klasse für den Dienst verwendet, die in der Frage veröffentlicht wurde, ohne zu ändern, wo ich mich irren kann, dass ich sie nicht erhalten habe
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(mView, params); // here
wenn ich dem WindowManger eine Ansicht hinzufüge
Hier ist meine Manifestdatei
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.searce.testoverlay"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="7" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name="TestOverlayActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:enabled="true" android:name=".HUD"></service>
</application>
</manifest>
Error
09-27 18:49:23.561: ERROR/AndroidRuntime(653): Uncaught handler: thread main exiting due to uncaught exception
09-27 18:49:23.571: ERROR/AndroidRuntime(653): java.lang.RuntimeException: Unable to create service com.searce.testoverlay.HUD: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRoot$W@44da9bc0 -- permission denied for this window type
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2790)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at android.app.ActivityThread.access$3200(ActivityThread.java:119)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1917)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at android.os.Handler.dispatchMessage(Handler.java:99)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at android.os.Looper.loop(Looper.java:123)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at android.app.ActivityThread.main(ActivityThread.java:4363)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at java.lang.reflect.Method.invokeNative(Native Method)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at java.lang.reflect.Method.invoke(Method.java:521)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at dalvik.system.NativeStart.main(Native Method)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRoot$W@44da9bc0 -- permission denied for this window type
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at android.view.ViewRoot.setView(ViewRoot.java:492)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at com.searce.testoverlay.HUD.onCreate(HUD.java:41)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2780)
09-27 18:49:23.571: ERROR/AndroidRuntime(653): ... 10 more
" @ ceph3us wissen Sie, wie Sie es für> = M erreichen können? ActivityCompat.requestPermissions (dieser neue String [] {Manifest.permission.SYSTEM_ALERT_WINDOW} ..."
SYSTEM_ALERT_WINDOW PERMISSION auf API> = 23 (Zeichnen über andere Apps usw.):
Mit dieser Berechtigung Activity.requestPermissions () aufrufen,
Lösung:
Beispielcode:
"Und wie kann der Benutzer diese Berechtigung deaktivieren? Sie wird in den Berechtigungen unter Einstellungen-> Apps ->" MyApp "-> Berechtigungen nicht angezeigt. Außerdem ... gibt es eine Erklärung, warum sich diese Berechtigung von den anderen in der Berechtigung unterscheidet Wie fordern wir es an? - Anonym 12. Februar um 21:01 "
Sondergenehmigungen
bearbeiten II:
Ich habe diesen Code in einer Aktivität verwendet, die FragmentActivity erweitert, und habe die Ausnahme java.lang.IllegalArgumentException erhalten: Kann nur niedrigere 16 Bit für requestCode verwenden, da der verwendete Anforderungscode nicht im Bereich von 0 .. 65535 liegt. Möglicherweise möchten Sie Ihren Anforderungscode in ändern ein angemessener Wert. - Mtsahakis
wie es heißt:
das liegt daran:
so zum Beispiel:
Code zur einfachen Verwendung in einem bestimmten Bereich
bearbeiten III:
Apps, die die Berechtigung SYSTEM_ALERT_WINDOW verwenden, können die folgenden Fenstertypen nicht mehr verwenden, um Warnfenster über anderen Apps und Systemfenstern anzuzeigen:
TYPE_PHONE TYPE_PRIORITY_PHONE TYPE_SYSTEM_ALERT TYPE_SYSTEM_OVERLAY TYPE_SYSTEM_ERROR
Stattdessen müssen Apps einen neuen Fenstertyp namens TYPE_APPLICATION_OVERLAY verwenden.
Fenstertyp: Anwendungsüberlagerungsfenster werden über allen Aktivitätsfenstern (Typen zwischen FIRST_APPLICATION_WINDOW und LAST_APPLICATION_WINDOW) angezeigt, jedoch unter kritischen Systemfenstern wie der Statusleiste oder IME.
Das System kann die Position, Größe oder Sichtbarkeit dieser Fenster jederzeit ändern, um die visuelle Unordnung für den Benutzer zu verringern und Ressourcen zu verwalten.
Erfordert die Berechtigung SYSTEM_ALERT_WINDOW.
Das System passt die Wichtigkeit von Prozessen mit diesem Fenstertyp an, um die Wahrscheinlichkeit zu verringern, dass der Killer mit geringem Speicherbedarf sie tötet. In Mehrbenutzersystemen wird nur auf dem Bildschirm des besitzenden Benutzers angezeigt.
quelle
java.lang.IllegalArgumentException: Can only use lower 16 bits for requestCode
da der verwendete Anforderungscode nicht im Bereich von 0 bis 65355 liegt. Sie können Ihren Anforderungscode möglicherweise in einen geeigneten Wert ändern.Nach der Antwort von ceph3us zum Hinzufügen eines Warnungsdialogs funktionierte dies einwandfrei
Die Verwendung von TYPE_SYSTEM_ALERT kann jedoch die Google-Abschaltrichtlinie für Apps mit gefährlichen Berechtigungen auslösen. Stellen Sie sicher, dass Sie eine gültige Begründung haben, falls Google dies benötigt.
quelle
Sie können Ihr Ziel-SDK auf 22 oder weniger ändern, dann funktioniert es auch mit API 23.
Ändern Sie es in Gradle.Build.
quelle