Android浮窗权限判断

您所在的位置:网站首页 nova4有悬浮窗口吗 Android浮窗权限判断

Android浮窗权限判断

2024-06-09 20:19| 来源: 网络整理| 查看: 265

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

在方法中添加以下代码:

//悬浮窗权限判断 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中的怎样写我还没有很好的办法,这只是一种暂时不报错的办法,并不严谨。

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3