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

Android应用如何区分文件夹删除与权限移除场景

区分SAF文件夹被删除与权限丢失的场景

要区分用户删除文件夹和移除访问权限这两种场景,核心是先检查Uri的持久化权限状态,再判断文件夹是否存在,具体步骤如下:

  • 第一步:检查Uri的访问权限
    使用ContentResolver.checkUriPermission()方法验证应用是否还持有目标文件夹Uri的写入权限。该方法直接返回权限状态,不受文件夹是否存在的影响。

  • 第二步:根据权限状态判断场景

    • 如果权限状态为PackageManager.PERMISSION_GRANTED,说明应用仍有访问权限,此时若DocumentFile.exists()返回false,则可确定是文件夹被删除。
    • 如果权限状态为PackageManager.PERMISSION_DENIED,则说明应用已失去该Uri的访问权限,无需再判断文件夹状态。

代码示例

// 假设savedUri是用户之前选择并持久化保存的文件夹Uri
Uri savedUri = ...;
ContentResolver resolver = getContentResolver();

// 检查写入权限状态
int permissionStatus = resolver.checkUriPermission(
        savedUri,
        Process.myPid(),
        Process.myUid(),
        Intent.FLAG_GRANT_WRITE_URI_PERMISSION
);

if (permissionStatus == PackageManager.PERMISSION_GRANTED) {
    DocumentFile targetFolder = DocumentFile.fromTreeUri(this, savedUri);
    if (targetFolder == null || !targetFolder.exists()) {
        // 权限有效,但文件夹已被删除
        Toast.makeText(this, "所选文件夹已被删除", Toast.LENGTH_SHORT).show();
    } else {
        // 文件夹正常,可执行写入操作
    }
} else {
    // 权限已丢失,提示用户重新选择文件夹
    Toast.makeText(this, "已失去对所选文件夹的访问权限,请重新选择", Toast.LENGTH_SHORT).show();
}

补充说明

  • 持久化Uri权限:用户通过ACTION_OPEN_DOCUMENT_TREE选择文件夹后,记得调用ContentResolver.takePersistableUriPermission()保存权限,否则应用重启后权限会失效。
  • 特殊情况:若用户在系统设置中撤销了应用的所有文件访问权限,checkUriPermission()也会返回PERMISSION_DENIED,此时统一按权限丢失处理即可。

内容的提问来源于stack exchange,提问作者Laurent D.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:51:00