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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:24:01