今天在做系統懸浮窗的時候出現權限拒絕,類型是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; }