该工具的使用范围及其广泛,理论支持一切可以通过SAF框架访问的文件目录,经测试,包括但不限于以下目录的访问
- Android11及以后的Android/data(obb)目录访问
- Android系统中对扩展储存卡的访问
- Android外接储存设备中文件目录的访问
Gradle 7.0以下,需要在项目级build.gradle文件中加入
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}Gradle 7.0以上,需要在setting.gradle文件中加入
dependencyResolutionManagement {
repositories {
...
maven { url 'https://jitpack.io' }
}
}远程仓库配置之后,即可在模块的build.gradle中引入SAFUtil
dependencies {
implementation 'com.github.xxinPro:SAFUtil:1.0'
}通过SAFUtil.create(Context, String)方法创建一个SAFUtil对象,第一个参数不议,第二个参数代表你想要访问的文件目录地址,下文中称作“权限目录”
SAFUtil safUtil = SAFUtil.create(context, "/storage/emulated/0/Android/data/com.test.folder");所有文件访问权限据说能提升SAF框架的访问速度
| 方法名 | 作用 |
|---|---|
| isManagerExternalPermission() | 判断是否拥有所有文件访问权限 |
| requestManagerExternalPermission(Activity activity, int requestCode) | 申请所有文件访问权限 |
创建SAFUtil对象时,第二个参数代表“权限目录”
| 方法名 | 作用 |
|---|---|
| isPermission() | 判断当前权限目录是否拥有访问权限 |
| requestPermission(Activity activity, int requestCode) | 申请权限目录的访问权限(Activity中调用) |
| requestPermission(Fragment fragment, int requestCode) | 申请权限目录的访问权限(Fragment中调用) |
| savePermission(int requestCode, Intent intent) | 权限申请后,返回当前Activity,调用该方法保存已经申请的权限 |
由于DocumentFile无法像File对象一样通过文件路径创建并且直接操作,所以通过文件路径获取DocumentFile时,必须传入要获取的目标文件的DocumentFile是文件类型还是文件夹类型,若目标文件或文件夹不存在,会自动创建
| 方法名 | 作用 |
|---|---|
| getDocumentFile() | 获取权限目录的DocumentFile对象 |
| getDocumentFile(String filePath, boolean isFile) | 获取权限目录的子文件DocumentFile对象 |
| getDocumentFile(DocumentFile documentFile, String filePath, boolean isFile) | 获取权限目录下子DocumentFile的子文件DocumentFile对象 |
对目标DocumentFile进行操作时,若不存在可以通过createFile(String filePath)创建。当然,也可以通过getDocumentFile(String filePath, boolean isFile)直接获取,会自动创建
注意传入的路径,一定要有其父目录的访问权限
| 方法名 | 作用 |
|---|---|
| createFolder(String folderPath) | 创建文件夹 |
| createFile(String filePath) | 创建文件 |
| deleteFile(String filePath, boolean isFile) | 删除文件夹或文件 |
| renameFile(String filePath, boolean isFile, String newName) | 重命名文件夹或文件 |
| copyFile(DocumentFile fromFile, File toFile) | 将DocumentFile文件复制到指定File |
| copyFile(File fromFile, DocumentFile toFile) | 将File复制到DocumentFile |
| copyFile(DocumentFile fromFile, DocumentFile toFile) | 将DocumentFile到DocumentFile |
注意传入的路径,一定要有其父目录的访问权限
| 方法名 | 作用 |
|---|---|
| getInputStream(String filePath) | 获取输入流 |
| getInputStream(DocumentFile documentFile) | 获取输入流 |
| getOutputStream(String filePath) | 打开输出流 |
| getOutputStream(DocumentFile documentFile) | 打开输出流 |
| getFileDescriptor(DocumentFile documentFile, String openMode) | 获取DocumentFile类型的文件描述 |
| 方法名 | 作用 |
|---|---|
| uriToPath(Uri uri) | 将Uri地址为普通文件路径 |
| uriToPath(String uriStr) | 将Uri地址为普通文件路径 |
体验demo和成品aar文件存放在release中,有需要请自行下载
详细逻辑请前往https://blog.xxin.xyz/2022/10/23/%E5%B0%81%E8%A3%85DocumentFile/