今天在做系统悬浮窗的时候出现权限拒绝,类型是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;
    }

 

版权声明:本文为lizhanqi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/lizhanqi/p/8214319.html