目录
调用系统文件管理器
可以使用registerForActivityResult()调用系统文件管理器
1.单选模式
通过 new ActivityResultContracts.OpenDocument() 进行单文件选择模式
代码如下(示例):
// 调用系统文件管理器
String[] types = {"image/*"};
registerForActivityResult(new ActivityResultContracts.OpenDocument(), result -> {
if (result == null) {
Toast.makeText(this, "无法获取文件", Toast.LENGTH_SHORT).show();
return;
}
// ....其他操作
}).launch(types);
其中types是限定文件类型,当然launch()还有其他用法。
2.多选模式
通过 new ActivityResultContracts.OpenMultipleDocuments() 进行多文件选择模式
代码如下(示例):
String[] types = {"image/*"};
registerForActivityResult(new ActivityResultContracts.OpenMultipleDocuments(), result -> {
if (result == null) {
Toast.makeText(this, "无法获取文件", Toast.LENGTH_SHORT).show();
return;
}
// ...其他操作
}).launch(types);
3.选择文件夹模式
通过 new ActivityResultContracts.OpenDocumentTree() 进行文件夹选择模式,并使用DocumentFile获取文件夹下的所有文件
下面展示的是选择文件夹,并获取文件夹所有文件的例子,代码如下(示例):
registerForActivityResult(new ActivityResultContracts.OpenDocumentTree(), result -> {
if (result == null) {
return;
}
// 使用DocumentFile.fromTreeUri获取指定目录下的文件
DocumentFile documentFile = DocumentFile.fromTreeUri(this, result);
if (documentFile == null) {
return;
}
// 获取文件列表
DocumentFile[] listFiles = documentFile.listFiles();
// 将DocumentFile[]数组转换成Uri集合
List<Uri> uriList = docFilesToUriList(listFiles);
// ...其他操作
}).launch(null);
将DecumentFile数组转成Uri集合
/**
* 将DocumentFile[]数组转换成Uri集合
*
* @param listFiles DocumentFile数组
* @return
*/
public List<Uri> docFilesToUriList(DocumentFile[] listFiles) {
List<Uri> uriList = new ArrayList<>();
for (DocumentFile docFile : listFiles) {
if (docFile == null) {
continue;
}
uriList.add(docFile.getUri());
}
return uriList;
}