Как получить доступ к каталогу и его файлам по пути URI дерева с помощью SAF

Я хочу выбрать все файлы в каталоге, а затем сохранить сжатую копию этих файлов в том же каталоге.

Если я использую Intent.ACTION_OPEN_DOCUMENT_TREE Я получаю дерево Uri, но я не могу понять, как мне получить Uri файла всех файлов, содержащихся в нем, и как записать в сам каталог.

В документации я не могу найти подобного варианта использования.

До принудительной SAF было достаточно получить путь к каталогу и работать со стандартными методами File, к сожалению, теперь все предыдущие методы, основанные на файлах и явных путях, нарушаются с помощью этого SAF.

2 ответа

Мне нужно время, чтобы понять:

          @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;
}

Я не могу понять, как мне получить Uri файла всех файлов, содержащихся в нем, и как записать в сам каталог.

Использовать DocumentFile.fromTreeUri() чтобы получить DocumentFile из Uri что вы вернетесь из ACTION_OPEN_DOCUMENT_TREE. Затем вы можете использовать методы наDocumentFile чтобы перечислить "файлы" в "каталоге", плюс createFile() для создания нового документа ("файла") в дереве.

Другие вопросы по тегам