Android7.0行为变更之适配文件提供者的方法

  

<强>两个小解释:

  

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行为变更之适配文件提供者的方法