Android中代码动态判断是否开启悬浮窗权限和申请悬浮窗权限
1.在AndroidManifest.xml中申请权限
<!-- 要获取CompatModeWrapper,首先得在应用程序的AndroidManifest.xml文件中添加权限 -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
2.判断悬浮窗权限是否开启
public static 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 || mode == AppOpsManager.MODE_IGNORED;
} else {
return Settings.canDrawOverlays(context);
}
}
}
3.使用
String androidSDK = Build.VERSION.SDK;
if(Integer.parseInt(androidSDK)>=23&&!Settings.canDrawOverlays(LoginActivity.this)){
Intent intent2 = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
startActivityForResult(intent2,1);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1){
if (PermissionUtils.checkFloatPermission(this)){
System.out.println("悬浮窗权限申请成功...");
}else{
System.out.println("悬浮窗权限申请失败...");
finish();
}
}
}
4.同一功能的两种显示效果
-
第一种:会进入到悬浮窗权限应用列表
-
使用以下代码,会进入到悬浮窗权限的列表,列表中是手机中需要悬浮窗权限的应用列表,你需要在此列表中找到自己的应用,然后点进去,才可以打开悬浮窗权限
-
Intent intent2 = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
-
startActivity(intent2);
-
第二种:直接进入到自己应用的悬浮窗权限开启界面
-
使用以下代码,则不会到上述所说的应用列表,而是直接进入到自己应用的悬浮窗权限开启界面
-
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
-
intent.setData(Uri.parse("package:" + getPackageName()));
-
startActivity(intent);
-
Build.VERSION.SDK_INT>= Build.VERSION_CODES.O//8.0以上,建议用第一种
-
Build.VERSION.SDK_INT>= Build.VERSION_CODES.M//6.0-8.0,建议用第二种
-
参考网址:https://blog.csdn.net/eyishion/article/details/82787310
参考网址:https://blog.csdn.net/lovedou0816/article/details/79253710
https://blog.csdn.net/aidou1314/article/details/88422007
第一篇《完》
---------------------------------------------------分割线-----------------------------------------------------------------
第二篇《开始》
Android 解决OPPO 5.1 浮窗权限不兼容问题
OPPO 5.1 浮窗权限开启并不像大多Android机那样在手机设置中,而是在OPPO的系统软件-手机安全中心-中,
故跳转到权限界面,需要做特殊处理。
1.判断是否为 OPPO 5.1 系统
if(Utils.isOppo() && Utils.getAndroidVersion().equals("5.1")) {
compat = new OppoCompatImpl();
}
2.通过包名、Activity名跳转到指定权限界面
public class OppoCompatImpl extends BelowApi23CompatImpl {
@Override
public boolean isSupported() {
return true;
}
@Override
public boolean apply(Context context) {
try {
Intent intent = new Intent(Intent.ACTION_MAIN);
ComponentName componentName = new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.permission.floatwindow.FloatWindowListActivity");
// ComponentName componentName = new ComponentName("com.coloros.safecenter", "com.coloros.safecenter.sysfloatwindow.FloatWindowListActivity");// oppo A37型号,能跳转到手机管家悬浮窗设置页
// ComponentName componentName = new ComponentName("com.color.safecenter", "com.color.safecenter.permission.PermissionManagerActivity");
intent.setComponent(componentName);
context.startActivity(intent);
return true;
} catch(Exception e){
e.printStackTrace();
}
return false;
}
}
————————————————
版权声明:本文为CSDN博主「Yurja_Lee」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38193813/article/details/80621459
如果有不当的地方,欢迎指正。感谢以上博主,谢谢!
如有侵权等不妥的地方,请各位博主评论区留言,本人看到会立刻处理。再次感谢!