在开启浮窗前,要判断一下,是否能够得到浮窗权限打开浮窗。
在方法中添加以下代码:
//悬浮窗权限判断
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中的怎样写我还没有很好的办法,这只是一种暂时不报错的办法,并不严谨。
仍在入门,如有错误,欢迎指出