0x01、报错堆栈

2022-06-08 11:56:26.187 19630-19630/xxxx E/AndroidRuntime: FATAL EXCEPTION: main
    Process: xxxx, PID: 19630
    java.lang.RuntimeException: Unable to start activity ComponentInfo{xxxx/xxxx.MainActivity}: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@8b2e0d -- permission denied for window type 2003
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@8b2e0d -- permission denied for window type 2003
        at android.view.ViewRootImpl.setView(ViewRootImpl.java:955)
        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:387)
        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:95)
        at xxxx.floatwindow.AbsFloatWindow.showWindow(AbsFloatWindow.java:95)
        at xxxx.floatwindow.FloatWindowMgr.showMenu(FloatWindowMgr.java:104)
        at xxxx.MainActivity.onCreate(MainActivity.java:112)
        at android.app.Activity.performCreate(Activity.java:7825)
        at android.app.Activity.performCreate(Activity.java:7814)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1306)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7356) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 
  • 主要报错代码:Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@8b2e0d -- permission denied for window type 2003

0x02、原因分析

这里需要区分安卓8版本前、后,对应的悬浮窗使用方式不一样,具体解决方案,往下看

0x03、解决方案

系统提示window弹窗方式: api=26+ -> WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; others -> WindowManager.LayoutParams.TYPE_PHONE; WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ mLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; } else { mLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;// 系统提示window

0x04、后记

谷歌真是个好东西

参考文献:

https://stackoverflow.com/questions/32224452/android-unable-to-add-window-permission-denied-for-this-window-type

【安卓悬浮窗】Unable to add window android.view.ViewRootImpl -- permission denied for window type Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@8b2e0d -- permission denied for window type 2003 Unable to add window android.view.ViewRootImpl permission denied for window type 2003 意思就是说在高版本的target 不能添加 LayoutParams.TYPE_SYSTEM_ALERT 适配如下:...
Android6.0之前,如果要弹出全局悬浮窗,只需要在AndroidManifest.xml中申请如下权限即可。 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 但是从Android6.0开始,不仅需要上述权限,还需要动态申请此权限,用户手动开启才行。 //检查权限 if (Bui...
Unable to add window android.view.ViewRootImpl -- permission denied for this window type
今天在写一个悬浮框的案例时,偶然发现了一个6.0存在的一个问题。 先上代码:private void addFlowLayoutOnWindow() { //获取WindowManager对象 windowManager = ((WindowManager) getSystemService(WINDOW_SERVICE)); //创建WindowMa
要写一个例子,于是创建了一个新项目,并设置android target build version =27。其中用到了AlertDialog. 结果因为权限一直报错,许久没在新的sdk上编译了,有挺多更新导致的问题。 此类型WindowManager.LayoutParams.TYPE_SYSTEM_ALERT 被系统收回去,普通级应用不再使用此类型,改为:。WindowManager.Lay
java.lang.RuntimeException:  Unable to create service com.spacesoftwares.floatingwindowdemo.MainService:  android.view.WindowManager$BadTokenException: Unable to add window android.view.V...
在6.0以前的系统版本,悬浮窗权限是默认开启的,直接使用即可。 而面向于6.0以后,如果没有处理权限相关的操作,可能会导致IDE报错:android.view.WindowManager$BadTokenException: permission denied for this window type 2003 ,那么对于6.0以上的版本我们就得申请权限。 申请权限(6.0以上版本)...
这个异常通常是由于在应用程序中试图使用不允许的窗口类型而引起的。在 Android 6.0 及以上版本中,应用程序需要在运行时请求一些敏感权限,例如窗口权限。如果未授予这些权限,则会发生 BadTokenException。 要解决此问题,您需要在应用程序的 AndroidManifest.xml 文件中添加以下权限: <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 然后,在运行时,您需要检查是否已授予此权限。如果没有授予,则需要请求该权限。您可以使用以下代码来检查和请求权限: ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); startActivityForResult(intent, REQUEST_CODE); } else { // Permission granted 这将启动一个设置界面,允许用户授予应用程序窗口权限。如果用户授予了权限,则可以执行您需要的操作。
【安卓悬浮窗】Unable to add window android.view.ViewRootImpl -- permission denied for window type gneL: 难怪有了权限还是给我报错,阿里嘎多,帮大忙了。