设置文件共享

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

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

注意FileProvider 类是 AndroidX 核心库的一部分。如需了解如何在应用中包含该支持库,请参阅声明依赖项

指定 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="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”构成的授权值。如需详细了解授权值,请参阅内容 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

如需了解其他相关信息,请参阅: