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 открытым: если этот объект будет собран мусором, канал больше не сможет получить доступ к файлу.

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