Android 8.0 Alert Dialog Unable to add window android.view.ViewRootImpl$W. permission denied

要写一个例子,于是创建了一个新项目,并设置android target build version =27。其中用到了AlertDialog.

结果因为权限一直报错,许久没在新的sdk上编译了,有挺多更新导致的问题。 此类型

WindowManager.LayoutParams.TYPE_SYSTEM_ALERT

被系统收回去,普通级应用不再使用此类型,改为:

WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY

确认 manifest 中加入了权限:<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

仍然报错:

 android.view.WindowManager$BadTokenException: 

Unable to add window android.view.ViewRootImpl$W@fe82d9d -- permission denied for this window type

需要在代码中动态加入申请弹出对话框权限。可以在app 启动时候加入,在调用之前最好再检查一次。

    private void getDialogPermission() {
        //Android6.0 + need require permission
        if (Build.VERSION.SDK_INT >= 23) {
            if (!Settings.canDrawOverlays(this)) {
                Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
                startActivity(intent);
                return;
            }
        }
    }

奇怪的是 intent 传入pacakge name 后,可以获取权限,但再次检查时候还是认为没有,所以不要传递package name。

好了,以上完成后,还是报错,再找问题原来Android 8.0 + 弹出框类型变了。需要做到向上向下兼容:

        if (Build.VERSION.SDK_INT >= 25) {
            shutdownDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
        } else {
            shutdownDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
        }
代码修改为如上。

到此代码运行才成功。第一次运行时候会申请权限,手动打开。再运行app就可以了。




你可能感兴趣的:(Android,文章)