Android如何检查其他应用是否已授予External Storage Manager权限
根因说明
MANAGE_EXTERNAL_STORAGE是Android 11(API 30)引入的特殊权限,不属于常规的运行时权限范畴,因此你调用PackageManager.checkPermission()无法获取到正确的授予状态,该方法仅对普通安装权限、运行时权限生效。
正确实现方案
你需要通过AppOpsManager查询该权限对应的应用操作标记,具体实现步骤如下:
前置条件
你的应用需要先获取android.permission.PACKAGE_USAGE_STATS权限,该权限需要引导用户到系统设置的「有权查看使用情况的应用」页面手动开启,否则无法查询其他应用的AppOps状态。
代码实现(Java)
import android.app.AppOpsManager; import android.content.Context; import android.os.Build; import android.content.pm.PackageManager; public boolean isOtherAppHasManageExternalStoragePermission(String targetPackageName) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { // 低于Android 11无该权限,默认返回true(走旧版存储权限逻辑) return true; } AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE); int op = AppOpsManager.strOpToOp("android:manage_external_storage"); try { // 获取目标应用的uid int targetUid = getPackageManager().getApplicationInfo(targetPackageName, 0).uid; int mode = appOpsManager.checkOpNoThrow(op, targetUid, targetPackageName); return mode == AppOpsManager.MODE_ALLOWED; } catch (PackageManager.NameNotFoundException e) { // 目标应用不存在,返回false return false; } }
代码逻辑说明
- 首先判断系统版本,低于Android 11不存在该特殊权限,走旧版存储逻辑即可
- 通过
strOpToOp转换得到MANAGE_EXTERNAL_STORAGE对应的AppOps标记,兼容不同系统版本的常量值差异 - 调用
checkOpNoThrow查询该标记的状态,返回MODE_ALLOWED即代表目标应用已获得所有文件访问权限
注意事项
- 若你未获取
PACKAGE_USAGE_STATS权限,调用checkOpNoThrow会始终返回MODE_IGNORED,无法得到正确结果 - 不要将该权限和普通的
READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE权限混淆,二者的授予逻辑完全独立
内容的提问来源于stack exchange,提问作者TiJo
相关产品推荐
相关产品推荐

