当前位置: 首页 > 知识库问答 >
问题:

如何以编程方式授予Android中的“借鉴其他应用程序”权限?

勾岳
2023-03-14

如何在设置中以编程方式授予权限-


共有3个答案

强保臣
2023-03-14

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

此方法基于以下Android源代码文件:AppOpsManager.java和DrawOverlayDetails.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项目中进行了测试,当Headwind MDM应用程序由平台密钥签名时,它在未经任何用户同意的情况下成功授予“Draw over other apps”权限。该代码已在Android 10(LineageOS 17)上进行了测试。

东郭宏朗
2023-03-14
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"/>
韦业
2023-03-14

您可以检查并请求覆盖权限,以便使用此应用程序覆盖其他应用程序

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