我想选择一个目录中的所有文件,然后将这些文件的副本压缩版本存储在同一目录中。
如果我使用Intent.ACTION_OPEN_DOCUMENT_TREE
我得到一棵树Uri
,但我不知道如何获取其中包含的所有文件的文件 Uri 以及如何在目录本身中写入。
在文档中我找不到任何类似的用例。
在强制SAF之前,获取目录路径并使用标准 File 方法就足够了,不幸的是,现在所有基于 Files 和显式路径的过去方法都被这个 SAF 破坏了。
我想选择一个目录中的所有文件,然后将这些文件的副本压缩版本存储在同一目录中。
如果我使用Intent.ACTION_OPEN_DOCUMENT_TREE
我得到一棵树Uri
,但我不知道如何获取其中包含的所有文件的文件 Uri 以及如何在目录本身中写入。
在文档中我找不到任何类似的用例。
在强制SAF之前,获取目录路径并使用标准 File 方法就足够了,不幸的是,现在所有基于 Files 和显式路径的过去方法都被这个 SAF 破坏了。
我无法弄清楚如何获取其中包含的所有文件的文件 Uri 以及如何在目录本身中写入。
用于从您返回的DocumentFile.fromTreeUri()
中获取 a 。然后,您可以使用 on 方法列出“目录”中的“文件”,并在树中创建一个新文档(“文件”)。DocumentFile
Uri
ACTION_OPEN_DOCUMENT_TREE
DocumentFile
createFile()
我花了一段时间才弄清楚:
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private List<Uri> readFiles(Context context, Intent intent) {
List<Uri> uriList = new ArrayList<>();
// the uri returned by Intent.ACTION_OPEN_DOCUMENT_TREE
Uri uriTree = intent.getData();
// the uri from which we query the files
Uri uriFolder = DocumentsContract.buildChildDocumentsUriUsingTree(uriTree, DocumentsContract.getTreeDocumentId(uriTree));
Cursor cursor = null;
try {
// let's query the files
cursor = context.getContentResolver().query(uriFolder,
new String[]{DocumentsContract.Document.COLUMN_DOCUMENT_ID},
null, null, null);
if (cursor != null && cursor.moveToFirst()) {
do {
// build the uri for the file
Uri uriFile = DocumentsContract.buildDocumentUriUsingTree(uriTree, cursor.getString(0));
//add to the list
uriList.add(uriFile);
} while (cursor.moveToNext());
}
} catch (Exception e) {
// TODO: handle error
} finally {
if (cursor!=null) cursor.close();
}
//return the list
return uriList;
}