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就可以了。
结果因为权限一直报错,许久没在新的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 8.0新特性适配测试报告来啦!
- [sp] Android 8.0 Fk: App process 启动过程
- Android 部分8.0手机(eg:华为荣耀V10) 更新下载应用后,不能调用安装的问题
- Android 8.0系统源码分析--Message发送、处理过程源码分析
- Android 8.0 应用快捷方式(ShortcutManager)的使用
- Android O(SDK 8.0)新特性
- Android 8.0 PKMS新变化之多线程扫描APK
- 一起来学习Android 8.0系统的应用图标适配吧
- Android 8.0透明Activity报错 "Only fullscreen activities can request orientation"
- Android 2分钟刷Android 8.0系统 和 8.0适配 完美方案
- Android(O) 8.0 怎样在后台启动service
- Android 8.0
- android 8.0 MountService -->StorageManagerService
- 总结android 8.0对app开发的影响
- 那些年,调试android 8.0指纹遇到的坑
- Android 8.0系统上使用WindowManager添加view的一个问题
- Android 8.0 PKMS新变化之提取ABI
- android 5.0 6.0 7.0 8.0预测新特性
- Android 8.0 隐式广播豁免列表
- Android 8.0 Oreo:您需要知道的功能与更新