设置文件共享

要安全地从您的应用提供文件到另一个应用,您需要配置您的应用以提供文件的安全句柄,形式为内容 URI。Android FileProvider组件根据您在 XML 中提供的规范生成文件的 content URI。本课程向您展示如何将FileProvider的默认实现添加到您的应用中,以及如何指定您希望提供给其他应用的文件。

注意:FileProvider类是AndroidX Core 库的一部分。有关在您的应用中包含此库的信息,请参阅声明依赖项

指定 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属性指定了您希望用于FileProvider生成的 content URI 的 URI 权限。在此示例中,权限为com.example.myapp.fileprovider。对于您自己的应用,请指定一个权限,该权限由应用的android:package值加上附加的字符串“fileprovider”组成。要了解有关权限值的更多信息,请参阅主题内容 URI以及android:authorities属性的文档。

<meta-data><provider>的子元素,它指向一个 XML 文件,该文件指定了您要共享的目录。android:resource属性是文件的路径和名称,不包含.xml扩展名。下一节将介绍此文件的内容。

指定可共享目录

FileProvider添加到应用清单后,您需要指定包含您要共享的文件的目录。要指定目录,请先在项目的res/xml/子目录中创建文件filepaths.xml。在此文件中,通过为每个目录添加一个 XML 元素来指定目录。以下代码段向您展示了res/xml/filepaths.xml内容的示例。代码段还演示了如何共享内部存储区域中files/目录的子目录

<paths>
    <files-path path="images/" name="myimages" />
</paths>

在此示例中,<files-path>标记共享应用内部存储的files/目录内的目录。path属性共享files/images/子目录。name属性告诉FileProvider将路径段myimages添加到files/images/子目录中文件的 content URI 中。

`<paths>` 元素可以有多个子元素,每个子元素指定一个不同的共享目录。除了 `<files-path>` 元素之外,还可以使用 `<external-path>` 元素共享外部存储中的目录,以及使用 `<cache-path>` 元素共享内部缓存目录中的目录。要了解有关指定共享目录的子元素的更多信息,请参阅 `FileProvider` 参考文档。

注意:XML 文件是指定要共享的目录的唯一方法;无法以编程方式添加目录。

现在,您已经完整地指定了一个 `FileProvider`,它为应用内部存储的 `files/` 目录中的文件或 `files/` 的子目录中的文件生成内容 URI。当您的应用为文件生成内容 URI 时,它包含在 `<provider>` 元素(`com.example.myapp.fileprovider`)中指定的权限、路径 `myimages/` 以及文件名。

例如,如果您根据本课中的代码片段定义了 `FileProvider`,并且您请求文件 `default_image.jpg` 的内容 URI,`FileProvider` 将返回以下 URI

content://com.example.myapp.fileprovider/myimages/default_image.jpg

有关其他相关信息,请参阅