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

