最近在做悬浮窗相关功能,关于悬浮窗权限问题做一下版本区分的讲解,着急使用的可以直接去完整代码看
版本号>=23
大家最常用的就是获取是否有悬浮窗权限,如果没有就去开启
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return Settings.canDrawOverlays(context);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
try {
val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION)
intent.data = Uri.parse("package:" + context?.packageName)
startActivityForResult(intent, REQUEST_CODE)
} catch (e: Exception) {
L.d(e.message)
}
}
但是, Vivo是特例,在vivo x20 plusA Android8.1.0的获取到的权限一直是true,但是并没有开启悬浮窗权限,所以需要单端判断是否有权限
public static boolean hasFloatFirstPermission(Context context) {
if (context != null) {
String packageName = context.getPackageName();
try {
Cursor query = context.getContentResolver()
.query(Uri.parse("content://com.iqoo.secure.provider.secureprovider/allowfloatwindowapp"), null,
"pkgname = ?", new String[] {
packageName}, null);
if (query == null) {
return hasFloatSecondPermission(context);
}
query.getColumnNames();
if (query.moveToFirst()) {
int i = query.getInt(query.getColumnIndex("currentlmode"));
query.close();
if (i == 0) {
return true;
}
return false;
}
query.close();
return hasFloatSecondPermission(context);
} catch (Exception unused) {
return hasFloatSecondPermission(context);
}
} else {
throw new IllegalArgumentException("context is null");
}
}
public static boolean hasFloatSecondPermission(Context context) {
String packageName = context.getPackageName();
try {
Cursor query = context.getContentResolver()
.query(Uri.parse("content://com.vivo.permissionmanager.provider.permission/float_window_apps"),
null, "pkgname = ?", new String[] {
packageName}, null);
if (query != null) {
if (query.moveToFirst()) {
int i = query.getInt(query.getColumnIndex("currentmode"));
query.close();
if (i == 0) {
return true;
}
return false;
}
query.close();
}
} catch (Exception unused) {
}
return false;
}
不仅如此,vivo获取悬浮窗权限也比较特殊.前面虽然判断出来没有权限了,但是开启悬浮窗权限的intent也不生效,需要再次区分判断.
public static boolean viVoFloatRequest(Activity context, int requestCode) {
try {
String str = Build.MODEL;
if ((!str.contains("Y85")