Как получить доступ к каталогу и его файлам по пути 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()
для создания нового документа ("файла") в дереве.