Android中代码动态判断是否开启悬浮窗权限和申请悬浮窗权限

1.在AndroidManifest.xml中申请权限


   

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

你可能感兴趣的:(Android,Studio,android6.0,悬浮窗权限,android8.0)