В этом уроке:
Вы также должны прочитать
Чтобы безопасно предложить файл вашего приложения другому приложению, необходимо настроить приложение, чтобы оно предлагало безопасный дескриптор файла, в виде URI содержимого. В Android FileProvider
компонент генерирует URI для контента файлов, основанные на спецификации, которую вы предоставляете в XML. Этот урок покажет вам, как добавить реализацию по умолчанию для FileProvider
вашего приложения, и как указать файлы, которые вы хотите предлагать другим приложениям.
Примечание: FileProvider
класс является частью Библиотеки поддержки v4. Для получения информации о том, как добавить эту библиотеку в ваше приложение, см. Настройка Библиотека Поддержки.
[wpanchor id=”1″]
Задайте поставщика файлов
Определение FileProvider
для вашего приложения требует наличия записи в манифесте. Данная запись определяет полномочия, которые будет использоваться при формировании URI контента, а также имя какого-либо XML файла, который определяет каталоги вашего приложения, которые будут использоваться для общего доступа.
В следующем фрагменте показано, как добавить в ваш манифест <provider>
элемент, который указывает FileProvider
класс, полномочия, и имя XML файла:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <application ...> <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.example.myapp.fileprovider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" /> </provider> ... </application> </manifest>
В этом примере, android:authorities
определяет полномочия URI, который вы хотите использовать для URI контента, сгенерированного FileProvider
. В примере, полномочия это com.example.myapp.fileprovider
. Для вашего собственного приложения, укажите полномочия, состоящие из значения элемента android:package
со строкой “fileprovider”, добавленной к нему. Чтобы узнать больше о значении полномочий, см. раздел URI контента и документацию к android:authorities
атрибуту.
<meta-data>
дочерний элемент <provider>
указывает на XML файл, в котором определяются каталоги общего доступа. android:resource
атрибут это путь и имя файла, без .xml
расширения. Содержимое этого файла описано в следующем разделе.
[wpanchor id=”2″]
Укажите каталоги совместного использования
После добавления FileProvider
в манифест вашего приложения, вам необходимо указать каталоги, которые содержат файлы общего доступа. Чтобы указать каталоги, начните с создания файла filepaths.xml
в res/xml/
подкаталоге вашего проекта. В этом файле укажите каталоги, добавляя XML элемент для каждого каталога. В следующем фрагменте показан пример содержимогоres/xml/filepaths.xml
. Фрагмент также демонстрирует, как открыть доступ для подкаталогаfiles/
каталога в вашем внутреннем хранилище:
<paths> <files-path path="images/" name="myimages" /> </paths>
В этом примере, <files-path>
тег открывает доступ к каталогам внутри files/
каталога внутреннего хранилища вашего приложения. path
атрибут открывает для общего доступа images/
подкаталог files/
name
атрибут говорит FileProvider
добавить сегмент пути myimages
к URI содержимого для файлов в files/images/
подкаталоге.
<paths>
элемент может иметь несколько дочерних элементов, каждый из которых определяет другой каталог общего доступа. В дополнение к <files-path>
элементу, вы можете использовать<external-path>
элемент для каталогов общего доступа во внешнем хранилище, и <cache-path>
элемент для каталогов в кэше во внутреннем хранилище. Чтобы узнать больше о дочерних элементах, которые определяют общие каталоги, см. документацию к FileProvider
.
Примечание: XML файл является единственным способом указать папки, которые вы хотите открыть для общего доступа; вы не можете добавить каталог программно.
Теперь у вас есть полная спецификация о FileProvider
, который генерирует URI для контента файлов в files/
каталоге внутреннего хранилища вашего приложения или файлов в подкаталогахfiles/
. Когда ваше приложение генерирует URI для контента файла, он содержит авторитетный источник, указанный в <provider>
элементе(com.example.myapp.fileprovider
), путь myimages/
, и имя файла.
Например, если вы определяете FileProvider
в соответствии с отрывками кода из этого урока, и вы запрашиваете URI для содержания файла default_image.jpg
, FileProvider
возвращает следующий URI:
content://com.example.myapp.fileprovider/myimages/default_image.jpg