Android 11 (R) доступ к пути к файлу - PullRequest
6 голосов
/ 23 февраля 2020

В соответствии с путем к файлу docs доступ предоставляется в Android R:

Начиная с Android 11, приложения, имеющие разрешение READ_EXTERNAL_STORAGE, могут читать медиа-файлы устройства, используя прямые пути к файлам и родные библиотеки. Эта новая возможность позволяет вашему приложению работать более гладко со сторонними медиа-библиотеками.

Проблема в том, что я не могу получить путь к файлу от MediaStore, так как мы должны читать путь к файлу, к которому мы не можем получить доступ / получить? Есть ли способ, о котором я не знаю, что мы можем получить путь к файлу от MediaStore?


Кроме того, документы говорят следующее :

Доступ ко всем файлам

Некоторые приложения имеют основной вариант использования, который требует широкого доступа к файлам, например, управление файлами или операции резервного копирования и восстановления. Они могут получить доступ ко всем файлам, выполнив следующие действия:

  1. Объявите разрешение MANAGE_EXTERNAL_STORAGE.
  2. Направьте пользователей на страницу настроек системы, где они могут включить параметр Разрешить доступ для управления всеми файлами. для вашего приложения.

Это разрешение предоставляет следующее:

  • Доступ для чтения и записи для всех файлов в общем хранилище.
  • Доступ к содержимому таблицы MediaStore.Files.

Но мне не нужен доступ ко всем файлам, я только хочу, чтобы пользователь выбрал видео из MediaStore и передал путь к файлу FFmpeg (требуется путь к файлу). Я знаю, что больше не могу использовать столбец _data для получения пути к файлу.


Обратите внимание:

  • Я знаю, что Uri возвращается из MediaStore и не указывает на файл.
  • Я знаю, что могу скопировать файл в каталог своего приложения и передать его в FFmpeg, но я мог бы сделать это до Android R.
  • Я не могу передать FileDescriptor на FFmpeg и не могу использовать /proc/self/fd/ (я получаю /proc/7828/fd/70: Permission denied при выборе файла на SD-карте), посмотрите эту проблему .

Так что я должен делать, я что-то упустил? Что подразумевалось под can read a device's media files using direct file paths and native libraries?

1 Ответ

1 голос
/ 29 марта 2020

Задав вопрос по issetracker , я пришел к следующим выводам:

  • При Android R мы можем однажды получить доступ к файлам. Мы по-прежнему можем использовать столбец данных для доступа к пути к файлу.
  • Если вы нацеливаетесь на Android 10> и хотите получить доступ / использовать пути к файлам, вам нужно будет добавить / сохранить следующее в вашем манифесте:

    android:requestLegacyExternalStorage="true"
    

    Это гарантирует, что пути к файлам работают на Android 10. На Android 11 этот атрибут будет игнорироваться.


По-прежнему рекомендуется использовать FileDescriptor или Uri, если это возможно. Но в моем случае мне пришлось получить доступ к объекту файла, так как FFmpeg выполняет поиск, что невозможно при использовании FileDescriptor.


Если вам нужен доступ к объекту файла и вы ищете способ сделать это, Я создал библиотеку , которая обрабатывает это для вас.

Вот краткое объяснение того, как это работает:

  • Вы открываете MediaStore и передаете возвращенную Uri в библиотеку.
  • Затем запрашивается столбец данных, чтобы получить путь к файлу.
  • Если поставщик содержимого неизвестно или если столбец данных возвращает ноль, файл копируется в каталог приложений (где у вас есть полный доступ к файлу), и возвращается этот путь.

Надеюсь, это кому-нибудь поможет .

...