You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 11+通过DPM/ROOT授予MANAGE_EXTERNAL_STORAGE等权限的方法

解决MANAGE_EXTERNAL_STORAGE权限及静默安装问题

一、MANAGE_EXTERNAL_STORAGE权限:从仅媒体访问到全文件访问

你提到用DPM授予权限后仍只能访问媒体文件,核心原因是权限标记和AppOps规则需同时配置,DPM通常只处理权限授予,未同步AppOps的允许状态。以下是两种可行方案:

1. 设备所有者权限方案

除了DPM授予权限,还需通过StorageManager启用全文件访问,并同步AppOps规则:

// 1. 启用全文件访问开关(设备所有者专属)
StorageManager storageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE);
if (DevicePolicyManager.isDeviceOwnerApp(this, getPackageName())) {
    storageManager.setManageExternalStorageEnabled(getPackageName(), true);
}

// 2. 配置AppOps允许规则
AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
appOpsManager.setMode(
    AppOpsManager.OPSTR_MANAGE_EXTERNAL_STORAGE,
    android.os.Process.myUid(),
    getPackageName(),
    AppOpsManager.MODE_ALLOWED
);

执行后,即可直接访问非媒体目录(如/storage/emulated/0/Documents、/storage/emulated/0/Download下的非媒体文件)。

2. ROOT权限方案

如果设备已ROOT,可通过命令行直接完成权限授予和规则配置:

# 授予MANAGE_EXTERNAL_STORAGE权限
pm grant com.your.package.name android.permission.MANAGE_EXTERNAL_STORAGE

# 允许AppOps规则
appops set com.your.package.name MANAGE_EXTERNAL_STORAGE allow

# (可选)强制开启全局全文件访问开关(部分Android版本有效)
settings put global external_storage_default_allow_all 1

二、静默安装未知来源应用(无用户交互)

1. 设备所有者权限方案

通过DevicePolicyManager设置安装策略为允许,再用PackageInstaller API完成静默安装:

// 1. 设置允许安装未知来源应用(设备所有者专属)
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName adminReceiver = new ComponentName(this, YourDeviceAdminReceiver.class);
dpm.setPackageInstallPolicy(adminReceiver, DevicePolicyManager.PACKAGE_INSTALL_ALLOWED);

// 2. 使用PackageInstaller静默安装APK
PackageInstaller packageInstaller = getPackageManager().getPackageInstaller();
PackageInstaller.SessionParams sessionParams = new PackageInstaller.SessionParams(
    PackageInstaller.SessionParams.MODE_FULL_INSTALL
);
int sessionId = packageInstaller.createSession(sessionParams);

try (PackageInstaller.Session session = packageInstaller.openSession(sessionId)) {
    // 写入APK文件到安装会话
    OutputStream outputStream = session.openWrite("app.apk", 0, -1);
    File apkFile = new File("/path/to/your/app.apk");
    FileInputStream inputStream = new FileInputStream(apkFile);
    byte[] buffer = new byte[4096];
    int length;
    while ((length = inputStream.read(buffer)) != -1) {
        outputStream.write(buffer, 0, length);
    }
    session.fsync(outputStream);
    inputStream.close();
    outputStream.close();

    // 提交安装请求
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
        this,
        sessionId,
        new Intent("com.your.package.INSTALL_COMPLETE"),
        PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE
    );
    session.commit(pendingIntent.getIntentSender());
} catch (IOException e) {
    e.printStackTrace();
}

2. ROOT权限方案

直接执行系统安装命令即可:

# 静默安装APK
pm install /path/to/your/app.apk

# 覆盖安装已存在应用
pm install -r /path/to/your/app.apk

内容的提问来源于stack exchange,提问作者H.A.H.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 01:10:23