如何以编程方式授予android中的"绘制其他应用程序"权限?

Ani*_*nga 0 java android

如何Settings -> Apps -> Draw over other apps在Android 中以编程方式授予权限?我想使用系统警报窗口,但无法在Android Marshmallow中强制用户通过"设置"应用并首先授予权限.

Sha*_*upa 15

您可以检查并要求使用此权限覆盖其他应用的覆盖权限

if (!Settings.canDrawOverlays(this)) {
    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, 0);
}
Run Code Online (Sandbox Code Playgroud)

  • 此代码会检查您的应用是否具有叠加权限.如果没有,则会将用户重定向到"设置">"应用">"绘制应用"页面,以允许用户授予权限.您无法以编程方式获得Android Marasmellow的许可. (2认同)
  • 我不太确定说有办法做到这一点。有一个名为 XOutOf10 的应用程序可以在没有用户交互的情况下启用此权限。 (2认同)
  • 如果您在他们的 Play 商店中查看说明,它会显示“Android 6.0+ 用户:在您第一次运行时,请确保您“允许在应用程序上绘图”。用户必须手动启用。在棉花糖之前是可能的,但之后就不行了 (2认同)

小智 13

if (!Settings.canDrawOverlays(this)) {
    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, 
Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, 0);
}

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"></uses-permission>
Run Code Online (Sandbox Code Playgroud)

  • 请添加一些解释,以避免在低质量帖子中出现此帖子。 (2认同)

vma*_*row 10

以下是自动授予程序包 SYSTEM_ALERT_WINDOW 权限的代码。要运行此代码,您的 Android 应用程序必须是系统应用程序(由平台密钥签名)。

该方法基于以下Android源代码文件:AppOpsManager.javaDrawOverlayDetails.java,参见方法DrawOverlayDetails.setCanDrawOverlay(boolean newState)

@TargetApi(Build.VERSION_CODES.KITKAT)
public static void autoSetOverlayPermission(Context context, String packageName) {
    PackageManager packageManager = context.getPackageManager();
    int uid = 0;
    try {
        ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, 0);
        uid = applicationInfo.uid;
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
        return;
    }

    AppOpsManager appOpsManager = (AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE);
    final int OP_SYSTEM_ALERT_WINDOW = 24;
    try {
        Class clazz = AppOpsManager.class;
        Method method = clazz.getDeclaredMethod("setMode", int.class, int.class, String.class, int.class);
        method.invoke(appOpsManager, OP_SYSTEM_ALERT_WINDOW, uid, packageName, AppOpsManager.MODE_ALLOWED);
        Log.d(Const.LOG_TAG, "Overlay permission granted to " + packageName);
    } catch (Exception e) {
        Log.e(Const.LOG_TAG, Log.getStackTraceString(e));
    }
}
Run Code Online (Sandbox Code Playgroud)

}

该代码已在Headwind MDM项目中进行了测试,当Headwind MDM 应用程序在没有任何用户同意的情况下,它成功授予了“Draw over other apps”权限(免责声明:我是 Headwind MDM 和 Headwind Remote 的项目所有者)由平台密钥签名。该代码已在 Android 10 (LineageOS 17) 上进行了测试。

  • 不幸的是,设备所有者不足以运行此代码。您需要通过平台密钥对您的应用程序进行签名并使用共享用户 android.uid.system。 (2认同)