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;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM