В этом уроке:
Вы также должны прочитать
Чтобы безопасно предложить файл вашего приложения другому приложению, необходимо настроить приложение, чтобы оно предлагало безопасный дескриптор файла, в виде 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