要安全地从您的应用向另一个应用提供文件,您需要配置您的应用以提供文件的安全句柄,形式为内容 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
生成的内容 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/
的子目录中的文件生成 Content URI。当您的应用为文件生成 Content URI 时,它包含在<provider>
元素(com.example.myapp.fileprovider
)中指定的权限、路径myimages/
以及文件名。
例如,如果您根据本课中的代码段定义FileProvider
,并请求文件default_image.jpg
的 Content URI,则FileProvider
会返回以下 URI
content://com.example.myapp.fileprovider/myimages/default_image.jpg
有关其他相关信息,请参阅