Чтобы безопасно предложить файл из вашего приложения другому приложению, вам необходимо настроить приложение так, чтобы оно предлагало безопасный дескриптор файла в форме URI контента. Компонент Android FileProvider
генерирует URI контента для файлов на основе спецификаций, которые вы предоставляете в XML. В этом уроке показано, как добавить реализацию FileProvider
по умолчанию в ваше приложение и как указать файлы, которые вы хотите предлагать другим приложениям.
Примечание. Класс FileProvider
является частью базовой библиотеки AndroidX . Сведения о включении этой библиотеки в ваше приложение см. в разделе «Объявление зависимостей» .
Укажите FileProvider
Для определения FileProvider
для вашего приложения требуется запись в вашем манифесте. Эта запись определяет полномочия, которые будут использоваться при создании URI контента, а также имя XML-файла, указывающего каталоги, которые ваше приложение может использовать совместно.
В следующем фрагменте показано, как добавить в манифест элемент <provider>
, который определяет класс FileProvider
, полномочия и имя XML-файла:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <application ...> <provider android:name="androidx.core.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
Содержимое этого файла описано в следующем разделе.
Укажите общие каталоги
После добавления 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
Для получения дополнительной информации см.: