设置文件共享

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

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

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

<provider> 的子元素 <meta-data> 指向一个 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 属性告诉 FileProviderfiles/images/ 子目录中的文件内容 URI 添加路径段 myimages

<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

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