Настройка общего доступа к файлам

Чтобы безопасно предложить файл вашего приложения другому приложению, необходимо настроить приложение, чтобы оно предлагало безопасный дескриптор файла, в виде URI содержимого. В Android FileProvider компонент генерирует URI для контента файлов, основанные на спецификации, которую вы предоставляете в XML. Этот урок покажет вам, как добавить реализацию по умолчанию для FileProvider вашего приложения, и как указать файлы, которые вы хотите предлагать другим приложениям.

Примечание: FileProvider класс является частью Библиотеки поддержки v4. Для получения информации о том, как добавить эту библиотеку в ваше приложение, см. Настройка Библиотека Поддержки.

Задайте поставщика файлов

Определение 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 расширения. Содержимое этого файла описано в следующем разделе.

Укажите каталоги совместного использования

После добавления 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