<强>两个小解释:强>
FileProvider是ContentProvider特殊的子类,ContentProvider通过创建内容://Uri来替代文件:///Uri。
在Android 7.0的以上的系统中,尝试传递文件://URI可能会触发FileUriExposedException
<强> FileProvider的这个概述包括以下主题:强>
1。定义FileProvider
2。指定可用文件
3。检索文件的内容URI
4。授予URI的临时权限
5。将内容URI提供给其他应用程序
<强>第一步:定义FileProvider: 强>
//清单文件中 & lt;提供者 android: name=" android.support.v4.content.FileProvider "//固定 android:当局=" $ {applicationId} .yourname”//根据您控制的域将属性设置为URI权限 android:出口=" false "//FileProvider不需要公开 android: grantUriPermissions=" true "祝辞//允许您授予对文件的临时访问权限 … & lt;/provider> >之前<强>第二步:指定可用文件强>
//新建一个xml文件用于存放应用需要共享的目录文件//以下路径元素告诉FileProvider您打算为图像/私有文件区域的子目录请求内容URI & lt; & # 63; xml version=" 1.0 " encoding=" utf - 8 " & # 63;比; & lt;路径xmlns: android=" http://schemas.android.com/apk/res/android "比; & lt; files-path name=癿y_images”=巴枷?/路径比; … & lt;/paths> >之前该元素必须包含一个或多个以下子元素:
//代表内部存储空间应用私有目录下的文件/目录,等同于Context.getFilesDir()所获取的目录路径; & lt; files-path name==奥肪丁?皀ame”路径比;//代表内部存储空间应用私有目录下的缓存/目录,等同于Context.getCacheDir()所获取的目录路径; & lt; cache-path name==奥肪丁?皀ame”路径比;//代表外部存储空间根目录,等同于Environment.getExternalStorageDirectory()所获取的目录路径; & lt; external-path name==奥肪丁?皀ame”路径比;//代表外部存储空间应用私有目录下的文件/目录,等同于Context.getExternalFilesDir (null)所获取的目录路径; & lt; external-files-path name==奥肪丁?皀ame”路径比;//代表外部存储空间应用私有目录下的缓存/目录,等同于Context.getExternalCacheDir (); & lt; external-cache-path name==奥肪丁?皀ame”路径比;//代表外部媒体区域根目录中的文件。等同于Context.getExternalMediaDirs ()。 & lt; external-media-path name==奥肪丁?皀ame”路径比; >之前这些子元素都使用两个相同的属性:
name="名称"
一个URI路径段。用于给路径属性所指定的子目录名称取一个别名为了提高安全性,此值将隐藏您要共享的子目录的名称。该值的子目录名称包含在该路径属性中。
路径="路径"
你正在分享的子目录。虽然该名称属性是一个URI路径段,但该路径值是实际的子目录名称。请注意,该值是指一个子目录,而不是独立文件名。您无法通过文件名共享单个文件,也无法使用通配符指定文件的子集。
<强>第三步:检索文件的内容URI 强>
//使用FileProvider类提供的公有静态方法getUriForFile生成内容URI//第一个参数:上下文上下文//第二个参数:清单文件中注册FileProvider时设置的当局属性值//第三个参数:要共享的文件,并且这个文件一定位于第二步我们在路文件中添加的子目录里面 Uri contentUri=FileProvider.getUriForFile(这一点, BuildConfig。APPLICATION_ID +”。myprovider”, myFile);<强>第四步:授予URI的临时权限强>
授权方式有两种:
第一种方式:
//调用方法://参数1:授权访问URI对象的其他应用包名//参数2:授权访问的Uri对象//参数3:授权类型FLAG_GRANT_READ_URI_PERMISSION或者FLAG_GRANT_WRITE_URI_PERMISSION (或者二者同时授权。这种形式的授权方式,权限有效期截止至发生设备重启或者手动调用revokeUriPermission()方法撤销授权时) grantUriPermission(包、Uri mode_flags) >之前第二种方式:
//配合意图使用//权限有效期截止至其它应用所处的堆栈销毁,并且一旦授权给某一个组件后,该应用的其它组件拥有相同的访问权限。 Intent.setFlags()或者Intent.addFlags () 意图。setData (Uri Uri);Android7.0行为变更之适配文件提供者的方法