1

我想选择一个目录中的所有文件,然后将这些文件的副本压缩版本存储在同一目录中。

如果我使用Intent.ACTION_OPEN_DOCUMENT_TREE我得到一棵树Uri,但我不知道如何获取其中包含的所有文件的文件 Uri 以及如何在目录本身中写入。

文档中我找不到任何类似的用例。

在强制SAF之前,获取目录路径并使用标准 File 方法就足够了,不幸的是,现在所有基于 Files 和显式路径的过去方法都被这个 SAF 破坏了。

4

2 回答 2

1

我无法弄清楚如何获取其中包含的所有文件的文件 Uri 以及如何在目录本身中写入。

用于从您返回的DocumentFile.fromTreeUri()中获取 a 。然后,您可以使用 on 方法列出“目录”中的“文件”,并在树中创建一个新文档(“文件”)。DocumentFileUriACTION_OPEN_DOCUMENT_TREEDocumentFilecreateFile()

于 2020-06-12T22:32:58.810 回答
1

我花了一段时间才弄清楚:

    @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;
}
于 2021-04-18T16:37:33.297 回答