Android - Storage Access Framework - Uri в локальный файл
Я использую Storage Access Framework(SAF)
в моем приложении. Чтобы отсканировать файл (фотографию или документ), мне нужно отправить локальный путь к файлу через API. Мне удалось настроить SAF
правильно, и теперь, когда пользователь выбирает файл, и я получаю Uri, как это должно быть.
Как кажется, Uri - это ключ для облака, а не локальный файл.
Значение Uri выглядит так:
content://com.android.providers.media.documents/document/image:11862
Как я могу преобразовать этот Uri в локальный файл? Должен ли я скачать файл из облака? Как мне это сделать?
2 ответа
Как кажется, Uri - это ключ для облака, а не локальный файл.
Uri
непрозрачная ссылка на часть содержимого. У вас нет возможности узнать, где находятся данные, и вас это не должно волновать.
Как я могу преобразовать этот Uri в локальный файл?
В идеале вы этого не делаете. В идеале вы "сканируете файл (фотографию или документ)", используя некоторую библиотеку, которая поддерживает InputStream
, В этом случае вы используете ContentResolver
а также openInputStream()
чтобы получить поток для передачи в библиотеку.
Если ваша библиотека не поддерживает InputStream
в качестве источника данных вам нужно будет использовать openInputStream()
самостоятельно, используя Java I/O для создания копии содержимого в виде файла в файловой системе, для передачи в библиотеку.
Вы можете читать непосредственно из базового файла с произвольным доступом при следующих условиях:
- URI указывает на локальный файл, вы можете проверить это, сравнив полномочия URI со значением
com.android.externalstorage.documents
; - У вас есть доступ как для чтения, так и для записи в URI.
ParcelFileDescriptor parcelFileDescriptor = getContext().getContentResolver().openFileDescriptor(documentUri, "rw");
FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
FileChannel channel = new FileInputStream(fileDescriptor).getChannel();
Сохраните FileDescriptor где-нибудь, пока вы держите FileChannel открытым: если этот объект будет собран мусором, канал больше не сможет получить доступ к файлу.