Зачем использовать FileProvider для внешних файлов?

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

Документы объясняют, как его также можно использовать для обмена файлами во внешнем хранилище (SD-карта и т. д.):

<external-path name="name" path="path" />

вместо

<files-path name="name" path="path" />

(https://developer.android.com/reference/android/support/v4/content/FileProvider.html)

какой в ​​этом смысл? Зачем вам нужно использовать FileProvider для этого? Другое приложение уже имеет доступ к внешнему хранилищу, поэтому все, что нужно любому другому приложению, — это путь к файлу, а не URI. Что мне не хватает?


person Mike Miller    schedule 13.10.2014    source источник


Ответы (2)


Другое приложение уже имеет доступ к внешнему хранилищу.

Не обязательно. Если у них нет разрешений READ_EXTERNAL_STORAGE или WRITE_EXTERNAL_STORAGE, у них нет доступа к внешнему хранилищу.

Кроме того, меня не удивит, если в какой-то момент времени вступят в силу более серьезные ограничения на внешнее хранилище (например, «рабочий» и «домашний» разделы в рамках инициативы Android Work), когда представление одного приложения о внешнем хранилище будет другим. чем представление внешнего хранилища другим приложением, даже если логически это один и тот же пользователь. Затем, даже если «рабочее» приложение имело правильные разрешения, оно могло не увидеть файл, помещенный во внешнее хранилище «домашним» приложением, если только «домашнее» приложение не обслуживало их через ContentProvider, например FileProvider.

person CommonsWare    schedule 13.10.2014
comment
Хорошо, это имеет большой смысл. Но в любом случае я все равно смог бы просмотреть каталог (если бы знал, где он находится) и сам найти все файлы, верно? И это не относится к файлам внутреннего хранилища: файлы, сохраненные во внутреннем хранилище, являются частными для вашего приложения, и другие приложения не могут получить к ним доступ (как и пользователь). - person Mike Miller; 14.10.2014
comment
@MikeMiller: я бы все равно смог просмотреть каталог (если бы знал, где он находится) и сам найти все файлы, верно? -- Я не знаю, кто я в этом предложении. Если я Майк Миллер, человек, то да, по крайней мере для сегодняшних устройств и предположительно в будущем. Однако имейте в виду, что планшеты Android 4.2+ поддерживают несколько учетных записей, и пользователь одной учетной записи не может просматривать файлы пользователя другой учетной записи, поскольку у них есть разные места для внутреннего и внешнего хранилища. - person CommonsWare; 14.10.2014
comment
@MikeMiller: И я извиняюсь, если вы не человек. Я, например, приветствую наших новых $SPECIES повелителей. :-) - person CommonsWare; 14.10.2014

Одно из изменений, внесенных в Android 4.4, относится к изменениям прав доступа к хранилищу. :

Ваше приложение не может читать общие файлы во внешнем хранилище при работе на Android 4.4, если у вашего приложения нет разрешения READ_EXTERNAL_STORAGE. То есть файлы в каталоге, возвращенном getExternalStoragePublicDirectory(), больше не доступны без разрешения.

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

person ianhanniballake    schedule 13.10.2014