Android 11+ 基于SAF实现卷根目录创建及ACTION_CREATE_DOCUMENT存在性跳过配置
基于SAF适配Android 11+存储卷根目录文件夹创建的实现方案
现存适配障碍
- 强制约束:所有存储操作必须通过SAF实现,不使用传统
File类做目录校验的非优雅方案;整体权限获取可通过ACTION_CREATE_DOCUMENT流程获得SD卡对应路径的读写授权 - 系统版本限制:
- Android 11及以上版本,不支持通过
ACTION_OPEN_DOCUMENT_TREE直接申请存储卷根目录的访问权限 ACTION_OPEN_DOCUMENT仅支持选择文件,不支持目录选择- 未获取对应文档树授权时,直接调用
DocumentFile.fromTreeUri(context, targetUri).exists()做目录校验,会触发权限拒绝报错
- Android 11及以上版本,不支持通过
- 现有临时方案的缺陷:用
File类判断目录存在性,不符合SAF调用逻辑,跨版本兼容性差
纯SAF链路的实现步骤
- 权限申请适配
绕过受限的根目录ACTION_OPEN_DOCUMENT_TREE申请流程,引导用户完成ACTION_CREATE_DOCUMENT的授权流程,获取SD卡对应路径的合法读写权限,拿到对应存储卷的可访问Uri后,直接使用SAF标准能力完成校验:
获得有效树Uri后,调用DocumentFile.fromTreeUri(context, workingDirUri)的exists()方法判断目录是否存在,完全不需要回退到传统File接口 - 文件夹创建逻辑
校验发现目标文件夹不存在时,直接调用DocumentFile提供的createDirectory()方法完成创建,不需要依赖ACTION_CREATE_DOCUMENT完成文件夹创建动作
关于ACTION_CREATE_DOCUMENT的说明
- 该Intent的设计目标是创建文档类文件,虽然流程中可以同步获得对应存储路径的读写授权,但本身不提供「目标文档已存在时跳过创建流程」的官方配置项
- 开发场景下不需要依托
ACTION_CREATE_DOCUMENT完成文件夹创建:只要拿到合法的树Uri权限,通过DocumentFile公开API就可以完成目录存在性判断、创建的全流程操作 - 关联的文件覆盖类问题,与当前文件夹创建的需求场景不完全匹配,不存在可直接复用的通用配置
内容的提问来源于stack exchange,提问作者usilo
相关产品推荐
相关产品推荐

