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.
相关产品推荐
相关产品推荐

