permission denied for window type 2003
今天在做系统悬浮窗的时候出现权限拒绝,类型是2003,这里要说下,做系统悬浮窗需要申请权限,6.0以上的 还需要动态申请下,这里我就不过多描述了,
我在申请完权限后仍然不行,这里主要是出现在了这个类型的设置上,上边代码是错误的,也就是TYPE_SYSTEM_ALERT因为这个被遗弃了,不赞成使用,
进去后看到,让使用 TYPE_APPLICATION_OVERLAY
因此我们需要根据不同版本使用不同代码
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){//6.0
params.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
}else {
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
}
修改后:
全部代码如下:(这里也是百度出来的)
private void createFloatView() { Button btn_floatView = new Button(App.getContext()); btn_floatView.setText("悬浮窗"); final WindowManager wm = (WindowManager) App.getContext().getSystemService(Context.WINDOW_SERVICE); final WindowManager.LayoutParams params = new WindowManager.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); // 设置window type //params.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){//6.0+ params.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; }else { params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; } /* * 如果设置为params.type = WindowManager.LayoutParams.TYPE_PHONE; 那么优先级会降低一些, * 即拉下通知栏不可见 */ params.format = PixelFormat.RGBA_8888; // 设置图片格式,效果为背景透明 // 设置Window flag params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; /* * 下面的flags属性的效果形同“锁定”。 悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应。 * wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL| LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCHABLE; * */ // 设置悬浮窗的长得宽 // params.width = 100; params.height = 100; params.x=0; params.y=-1080; // 设置悬浮窗的Touch监听 final Button finalBtn_floatView = btn_floatView; btn_floatView.setOnTouchListener(new View.OnTouchListener() { int lastX, lastY; int paramX, paramY; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); paramX = params.x; paramY = params.y; break; case MotionEvent.ACTION_MOVE: int dx = (int) event.getRawX() - lastX; int dy = (int) event.getRawY() - lastY; params.x = paramX + dx; params.y = paramY + dy; // 更新悬浮窗位置 wm.updateViewLayout(finalBtn_floatView, params); break; } return true; } }); wm.addView(btn_floatView, params); wm.updateViewLayout(finalBtn_floatView, params); isAdded = true; }