要将应用程序中的文件安全地提供给另一个应用程序,您需要配置应用程序,以内容URI的形式为文件提供安全句柄。 Android FileProvider组件根据您在XML中提供的规范生成文件的内容URI。 本文将向您展示如何将FileProvider的默认实现添加到您的应用程序,以及如何指定要提供给其他应用程序的文件。
注意:FileProvider类是v4支持库( v4 Support Library)的一部分
指定FileProvider
为应用程序定义FileProvider需要在清单中输入一个条目。此条目指定用于生成内容URI的权限,以及指定您的应用程序可以共享的目录的XML文件的名称。
以下代码段显示如何向清单中添加指定FileProvider类,权限和XML文件名的元素:
<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”。
<meta-data> , <provider>
指向一个XML文件,指定您要共享的目录。 android:resource属性是文件的路径和名称,没有.xml扩展名。此文件的内容将在下一节中描述。
指定可分享目录
将FileProvider添加到应用程序清单后,您需要指定包含要共享的文件的目录。要指定目录,首先在项目的res / xml /子目录中创建文件filepaths.xml。在此文件中,通过为每个目录添加一个XML元素来指定目录。以下代码段显示了res / xml / filepaths.xml内容的示例。该代码段还演示了如何在内部存储区域中共享文件/目录的子目录:
<paths>
<files-path path="images/" name="myimages" />
</paths>
在此示例中,<files-path>
标记共享应用程序内部存储的files /目录中的目录。 path属性共享files /的images /子目录。 name属性指示FileProvider将路径段myimages添加到files / images /子目录中的文件的内容URI。
<path>
元素可以有多个子节点,每个子节点指定一个不同的目录来共享。除了<files-path>
元素,您还可以使用<external-path>
元素共享外部存储器中的目录,使用<cache-path>
元素共享内部缓存目录中的目录。
注意:XML文件是您可以指定要共享的目录的唯一方法;您不能以编程方式添加目录。
您现在有一个完整的FileProvider规范,为应用程序内部存储器的文件/目录中的文件或文件/子目录中的文件生成内容URI。当您的应用为文件生成内容URI时,它包含在<provider>
元素(com.example.myapp.fileprovider)中指定的权限,路径myimages /和文件名称。
例如,如果根据本课程中的片段定义FileProvider,并且请求文件default_image.jpg的内容URI,FileProvider将返回以下URI:
content://com.example.myapp.fileprovider/myimages/default_image.jpg