您的位置:首页 > 移动开发 > Android开发

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

2018-01-30 16:28 357 查看
要写一个例子,于是创建了一个新项目,并设置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就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: