Настройка обмена файлами

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

Для получения дополнительной информации см.: