若要安全地将应用中的文件提供给其他应用,您需要配置应用,以内容 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
如需了解其他相关信息,请参阅: