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