首页 > 解决方案 > 窗口类型 2002 和 2038 的权限被拒绝

问题描述

我正在显示一个服务过度窗口,并且它与我的大多数用户都可以正常工作,但是我在 Crashlytics 上发现了这些错误

旧设备(Android 7 及更低版本)

Fatal Exception: java.lang.RuntimeException: Unable to create service com.app.name.mainService: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@43108e0 -- permission denied for window type 2002
   at android.app.ActivityThread.handleCreateService + 3172(ActivityThread.java:3172)
   at android.app.ActivityThread.-wrap5(ActivityThread.java)
   at android.app.ActivityThread$H.handleMessage + 1550(ActivityThread.java:1550)
   at android.os.Handler.dispatchMessage + 102(Handler.java:102)
   at android.os.Looper.loop + 154(Looper.java:154)
   at android.app.ActivityThread.main + 6077(ActivityThread.java:6077)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run + 865(ZygoteInit.java:865)
   at com.android.internal.os.ZygoteInit.main + 755(ZygoteInit.java:755)

较新的设备(尤其是 Galaxy S8 Android 9.0)

Fatal Exception: java.lang.RuntimeException: Unable to create service com.app.name.mainService: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@df3ca8f -- permission denied for window type 2038
   at android.app.ActivityThread.handleCreateService + 3768(ActivityThread.java:3768)
   at android.app.ActivityThread.access$1400 + 237(ActivityThread.java:237)
   at android.app.ActivityThread$H.handleMessage + 1801(ActivityThread.java:1801)
   at android.os.Handler.dispatchMessage + 106(Handler.java:106)
   at android.os.Looper.loop + 214(Looper.java:214)
   at android.app.ActivityThread.main + 7050(ActivityThread.java:7050)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run + 493(RuntimeInit.java:493)
   at com.android.internal.os.ZygoteInit.main + 965(ZygoteInit.java:965)

我正在使用的代码是

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            params = new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.MATCH_PARENT,
                    WindowManager.LayoutParams.MATCH_PARENT,
                    WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,

                    WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN |
                            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
                            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
                            WindowManager.LayoutParams.FLAG_SPLIT_TOUCH |
                            WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
                    PixelFormat.TRANSLUCENT);
        } else {
            params = new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.MATCH_PARENT,
                    WindowManager.LayoutParams.MATCH_PARENT,
                    WindowManager.LayoutParams.TYPE_PHONE,

                    WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN |
                            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
                            WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
                            WindowManager.LayoutParams.FLAG_SPLIT_TOUCH |
                            WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
                    PixelFormat.TRANSLUCENT);
        }

        mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        if (mWindowManager != null) {
            mWindowManager.addView(serviceRootView, params);
        }

我还确保已授予 Draw 权限并且清单文件具有以下权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

我搜索了很多其他问题,都提出了上述解决方案,但由于崩溃仍然发生,所以没有帮助!

标签: javaandroidandroid-serviceandroid-permissions

解决方案


推荐阅读