设置文件共享

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

注意FileProvider 类是 v4 支持库的一部分。如需了解如何在应用中包含该支持库,请参阅支持库设置

指定 FileProvider

要为应用定义 FileProvider,您需要在应用清单中添加一个条目。此条目指定生成内容 URI 时使用的授权以及 XML 文件的名称,该 XML 文件指定应用可共享的目录。

以下代码段展示了如何在清单中添加指定 FileProvider 类、授权以及 XML 文件名的 <provider> 元素:

    <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 属性指定您希望用于由 FileProvider 生成的内容 URI 的 URI 授权。示例中的授权为 com.example.myapp.fileprovider。对于您自己的应用,请指定由应用的 android:package 值加上字符串“fileprovider”构成的授权值。要详细了解授权值,请参阅内容 URI 主题和 android: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 属性指示 FileProvider 将路径段 myimages 添加到 files/images/ 子目录中文件的内容 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

要了解更多相关信息,请参阅: