AlertDialog因为权限一直报错:
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就可以了。