报错内容:
2004 android.view.WindowManager$BadTokenException
Unable to add window android.view.ViewRootImpl$W@c86d89f -- permission denied for window type 2003
出错堆栈
1 android.view.ViewRootImpl.setView(ViewRootImpl.java:904)
2 android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:369)
3 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:128)
4 com.xhw.angel_doctor.fragment.LeftFragment.showWindow(LeftFragment.java:516)
5 com.xhw.angel_doctor.fragment.LeftFragment.access$600(LeftFragment.java:66)
6 com.xhw.angel_doctor.fragment.LeftFragment$LeftClickListener.onItemClick(LeftFragment.java:309)
今天手机系统更新到android8.0 发现项目的WindowManager弹出框出错了,于是找了许久发现是android8.0的WindowManager属性type类型变更了
于是就做以8.0的SDK分界做了下判断就好了
private WindowManager wm;
private View windowFriendLocLayout;
private WindowManager.LayoutParams lp;
private boolean isShow = false;
//弹出框 没有添加经纬度就提示添加经纬度
private void showWindow() {
if (wm == null) {
wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
lp = new WindowManager.LayoutParams();
//窗口类型
if (Build.VERSION.SDK_INT > 25) {
lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
lp.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
}
lp.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
lp.gravity = Gravity.CENTER;
// 设置图片格式,效果为背景透明
lp.format = PixelFormat.RGBA_8888;
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.height = WindowManager.LayoutParams.MATCH_PARENT;
windowFriendLocLayout = LayoutInflater.from(context).inflate(R.layout.window_getlat, null);
//设置监听
windowFriendLocLayout.findViewById(R.id.text_cancel).setOnClickListener(myOnClickListener);
windowFriendLocLayout.findViewById(R.id.text_submit).setOnClickListener(myOnClickListener);
TextView textView = (TextView) windowFriendLocLayout.findViewById(R.id.title);
textView.setText("温馨提示");
TextView textView1 = (TextView) windowFriendLocLayout.findViewById(R.id.content);
textView1.setText("暂未通过认证,不可操作,去认证医生资质?");
}
if (!isShow) {
wm.addView(windowFriendLocLayout, lp);
isShow = true;
}
}
关键代码
//窗口类型
if (Build.VERSION.SDK_INT > 25) {
lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
lp.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
}