我解决这个问题是看的别人的博客解决的.这里只是用来记录一下加深这个问题的印象,这里放上地址:https://blog.csdn.net/lovedou0816/article/details/79253710
我开始是用的github上的一个开源库来申请悬浮窗权限的,但是当我开启了权限后这个第三方库返回的结果还是我未开启悬浮窗权限,所以我就只能自己写了。
上代码:
public boolean checkFloatPermission(Context context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
return true;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
try {
Class cls = Class.forName("android.content.Context");
Field declaredField = cls.getDeclaredField("APP_OPS_SERVICE");
declaredField.setAccessible(true);
Object obj = declaredField.get(cls);
if (!(obj instanceof String)) {
return false;
}
String str2 = (String) obj;
obj = cls.getMethod("getSystemService", String.class).invoke(context, str2);
cls = Class.forName("android.app.AppOpsManager");
Field declaredField2 = cls.getDeclaredField("MODE_ALLOWED");
declaredField2.setAccessible(true);
Method checkOp = cls.getMethod("checkOp", Integer.TYPE, Integer.TYPE, String.class);
int result = (Integer) checkOp.invoke(obj, 24, Binder.getCallingUid(), context.getPackageName());
return result == declaredField2.getInt(cls);
} catch (Exception e) {
return false;
}
} else {
/*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
AppOpsManager appOpsMgr = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
if (appOpsMgr == null)
return false;
int mode = appOpsMgr.checkOpNoThrow("android:system_alert_window", android.os.Process.myUid(), context.getPackageName());
return (mode == AppOpsManager.MODE_ALLOWED);
} else {*/
return Settings.canDrawOverlays(context);
// }
}
}
使用google提供的android 6.0以及以后可以使用的接口Settings.canDrawOverlays(context)来进行权限是否开启的判断,有些8.0手机的话是需要打开注释中的代码才能正确的返回权限是否开启了的,而有的手机是不需要的。不过我测试的时候是没有放开注释代码返回的权限状态才正确,加上反而不正确了,所以我是把这一段代码给注释了直接return Settings.canDrawOverlays(context)的!
之后你再在你需要使用悬浮窗的地方调用这个方法就可以了.如果对返回的状态不明白,可以去上面的链接中看看,他的文章中有对状态的详细描述.
写的不好 ,纯属个人所遇到的问题记录!!!!!!!