Android浮窗权限判断

在开启浮窗前,要判断一下,是否能够得到浮窗权限打开浮窗。

在方法中添加以下代码:


//悬浮窗权限判断

if (Settings.canDrawOverlays(MainActivity.this)) {

    Intent intent = new Intent(MainActivity.this, MainService.class);

    Toast.makeText(MainActivity.this,"已开启Toucher",Toast.LENGTH_SHORT).show();

    startService(intent);

    finish();

} else {

    //若没有权限,提示获取.

    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);

    Toast.makeText(MainActivity.this,"需要取得权限以使用悬浮窗",Toast.LENGTH_SHORT).show();

    startActivity(intent);

}

使用toast进行是否开启的提示,使用intent进行跳转。

若不用intent或者可参照前一篇,若有权限,windowmanager设置浮窗。

但有的人用以上代码可能会出现报错:Call requires API level 23 (current min is 15)

这需要在Grandle Scrips中的build.grandle中的android中的defaultConfig中修改,把minSdkVersion 15 改为minSdkVersion 23即可。但是如果你的API版本很低不能支持23,这种方法也不能解决。

新的修改方法如下:


if(Build.VERSION.SDK_INT >= 23) {
                                              //当版本高于等于23,放心使用上面的代码,不会报错
                                                if (Settings.canDrawOverlays(MainActivity.this)) {

                                                    //浮窗获得service
                                                    windowManager  = (WindowManager) getApplication().getSystemService(WINDOW_SERVICE);

                                                    lp.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT |WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;

                                                    lp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;

                                                    lp.gravity = Gravity.LEFT|Gravity.TOP;  //显示在屏幕左上角

                                                    //显示位置与指定位置的相对位置差
                                                    lp.x = 0;
                                                    lp.y = 0;
                                                    //悬浮窗的宽高
                                                    lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
                                                    lp.height = WindowManager.LayoutParams.WRAP_CONTENT;

                                                    lp.format = PixelFormat.TRANSPARENT;

                                                    //移除窗口
                                                    if (imageView != null){
                                                        windowManager.removeView(imageView);
                                                    }

                                                    //imageview设置
                                                    imageView = new ImageView(getApplicationContext());
                                                    imageView.setImageResource(R.mipmap.ic_launcher);
                                                    windowManager.addView(imageView,lp);

                                                    //imageview触摸监听
                                                    imageView.setOnTouchListener(new View.OnTouchListener() {
                                                        private float lastX, lastY;
                                                        private float nowX, nowY;
                                                        private float tranX,tranY;

                                                        @Override
                                                        public boolean onTouch(View v, MotionEvent event) {
                                                            boolean ret = false;
                                                            switch (event.getAction()){
                                                                //按下
                                                                case MotionEvent.ACTION_DOWN:
                                                                    //上次位置
                                                                    lastX = event.getRawX();
                                                                    lastY = event.getRawY();
                                                                    ret = true;
                                                                    break;
                                                                //拖动
                                                                case MotionEvent.ACTION_MOVE:
                                                                    //当前目标位置
                                                                    nowX = event.getRawX();
                                                                    nowY = event.getRawY();
                                                                    tranX = nowX - lastX;
                                                                    tranY = nowY - lastY;
                                                                    //移动
                                                                    lp.x += tranX;
                                                                    lp.y += tranY;
                                                                    //更新位置
                                                                    windowManager.updateViewLayout(imageView,lp);
                                                                    //记录当前坐标作为下一次计算的上一次移动的位置坐标
                                                                    lastX = nowX;
                                                                    lastY = nowY;
                                                                    break;
                                                                //弹起不操作
                                                                case MotionEvent.ACTION_UP:
                                                                    break;
                                                            }
                                                            return ret;
                                                        }
                                                    });

                                                    Toast.makeText(MainActivity.this,"已开启Toucher",Toast.LENGTH_SHORT).show();

                                                } else {

                                                    //若没有权限,提示获取.

                                                    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);

                                                    Toast.makeText(MainActivity.this,"需要取得权限以使用悬浮窗",Toast.LENGTH_SHORT).show();

                                                    startActivity(intent);

                                                }



                                            } else {
                                         //当版本低于23时,canDrawOverlays报错,可使用其他方法....
                                         }

具体else中的怎样写我还没有很好的办法,这只是一种暂时不报错的办法,并不严谨。

仍在入门,如有错误,欢迎指出

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值