无法添加窗口android.view.ViewRoot$W@44da9bc0 – 此窗口types的权限被拒绝

我比较喜欢这个post,但是我得到了将viewgroup添加到windowmanager对象的错误,我已经使用相同的服务类作为张贴到问题没有改变,我可以误会我没有得到它

WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); wm.addView(mView, params); // here 

当我添加视图到WindowManger

这是我的清单文件

 <?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> 

错误

 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 

尝试在AndroidManifest.使用此权限AndroidManifest.

 android.permission.SYSTEM_ALERT_WINDOW 

在API> = 23上看到

@ ceph3us你知道如何实现> = M?ActivityCompat.requestPermissions(this,new String [] {Manifest.permission.SYSTEM_ALERT_WINDOW} …”

  1. API> = 23 (通过其他应用程序等绘制)的SYSTEM_ALERT_WINDOW权限

    • 不再出现在应用的权限屏幕上。
    • 它甚至不出现在奇怪的令人困惑的新的“所有权限”屏幕上
  2. 使用此权限调用Activity.requestPermissions()

    • 将不会显示任何用户的对话框允许/拒绝。
    • 相反,Activity.onRequestPermissionsResult()callback将被立即调用一个拒绝标志。

解:

如果应用程序的API级别为23或更高,则应用程序用户必须通过权限pipe理屏幕向应用程序明确授予此权限。 该应用程序通过发送具有操作ACTION_MANAGE_OVERLAY_PERMISSION的意图来请求用户的批准 。 该应用程序可以通过调用Settings.canDrawOverlays()来检查它是否具有此授权。

示例代码:

 /** code to post/handler request for permission */ public final static int REQUEST_CODE = -1010101; *(see edit II)* public void checkDrawOverlayPermission() { /** check if we already have permission to draw over other apps */ if (!Settings.canDrawOverlays(Context)) { /** if not construct intent to request permission */ Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); /** request permission via start activity for result */ startActivityForResult(intent, REQUEST_CODE); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { /** check if received result code is equal our requested code for draw permission */ if (requestCode == REQUEST_CODE) { / ** if so check once again if we have permission */ if (Settings.canDrawOverlays(this)) { // continue here - permission was granted } } } 

“用户如何禁用此权限?它不显示权限设置 – >应用程序 – >”MyApp“ – >权限。此外…任何解释为什么这个权限不同于其他我们要求的方式? – 匿名2月12日在21:01“

有几个权限不具有正常和危险的权限。 SYSTEM_ALERT_WINDOW和WRITE_SETTINGS特别敏感,所以大多数应用程序不应该使用它们。 如果应用程序需要这些权限之一,则必须在清单中声明权限,并发送请求用户授权的意图。 系统通过向用户显示详细的pipe理屏幕来响应该意图。

特殊权限

编辑II:

我在扩展FragmentActivity的Activity中使用了这段代码,并且得到了java.lang.IllegalArgumentExceptionexception:只能使用低16位的requestCode,因为使用的请求代码不在0 .. 65535的范围内。您可能会考虑将请求代码更改为一个合适的价值。 – mtsahakis

因为它是:

请求代码必须在0 .. 65535的范围内。

这是因为:

  • java中的整数由32位表示
  • 您可以使用低16位的requestCode
  • 其他位用于请求处理

例如:

 integer value: 5463 ///hi 16 bits // | // lo 16 bits // as binary string will look like: 0000 0000 0000 0000 0001 0101 0101 0111 

在给定范围内简单使用代码

您可以将您的目标SDK更改为22或更less,然后它也可以在API 23上工作。

在Gradle.Build中更改它。