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

时间:2016-11-01 06:52:14

标签: java android

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

4 个答案:

答案 0 :(得分:15)

您可以使用此

检查并要求覆盖权限以覆盖其他应用
if (!Settings.canDrawOverlays(this)) {
    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, 0);
}

答案 1 :(得分:0)

检查此问题和答案:

NPM package

“每个请求SYSTEM_ALERT_WINDOW权限并通过Play商店安装(要求版本6.0.5或更高版本)的应用,都会自动授予该权限。”

答案 2 :(得分:0)

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>

答案 3 :(得分:0)

这是自动授予包的 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));
    }
}

}

该代码已在 Headwind MDM 项目中进行测试,它成功授予了“绘制其他应用程序”权限,而无需任何用户同意 aPuppet remote access 应用程序(免责声明:我是 Headwind MDM 的项目所有者和 aPuppet),当 Headwind MDM 应用程序由平台密钥签名时。代码已在 Android 10 (LineageOS 17) 上进行测试。