android7.0 通过FileProvider获取uri

android7.0以后,使用Uri.fromFile会报FileUriExposedException异常,这是因为android7.0以后执行了更加严格的文件管理,要解决这一错误需要使用7.0新添加的FileProvide类,

FileProvider使用步骤:

1、注册一个FileProvider
在manifest里面定义一个FileProvider:


    ...
    
        ...
        
      
            ...
        
        ...
    

name直接使用系统的android.support.v4.content.FileProvider,如果需要自己继承FileProvider,则在这里写自己的FileProvider,一定要写全名,即:包名+类名。exported设置为false,即FileProvider不需要共享,grantUriPermissions设置为true,即允许获取临时读取uri的权限。
2、指定可用文件

在res资源文件夹下建立xml文件夹,在xml文件夹下创建一名为file_paths的资源文件:



   


paths元素必须包含以下一个或者多个子元素:

  1. files-path 对应目录Context.getFilesDir()
  2. cache-path 对应目录Context.getCacheDir()
  3. external-path 对应目录Environment.getExternalStorageDirectory()
  4. external-files-path 对应目录Context,getExternalFilesDir(String) 或者Context.getExternalFilesDir(null)
  5. external-cache-path 对应目录Context.getExternalCacheDir()。

这一点要谨记,在后面创建文件时会用到。
name 是分享的文件路径的一部分,它会覆盖要分享的真实的路径,即path指定的路径。 后续生成 content:// URI 时,会使用这个别名代替真实目录名。这样做的目的,很显然是为了提高安全性

path 属性用于指定当前子元素所代表目录下需要共享的子目录名称。注意:path 属性值不能使用具体的独立文件名,只能是目录名。

意味着路径下的全部文件
  

然后在第一步的provider中引用这个资源文件:


    


3、生成Uri

首先创建文件:

File fiil = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+“/kgh/res”);

接下来,生成Uri:

Uri contentUri = FileProvider.getUriForFile(getContext(), "com.kgh.test.fileprovider", fiil);

getUriForFile方法中的第二个参数要与第一步中在manifest文件里面创建的provider里面的android:authorities名称一样
在file-path中使用name为beta_external_files_path ;
正常路径:/storage/emulated/0/kgh/res/c.apk
uri路径:content://com.kgh.test.fileprovider/beta_external_files_path/c.apk
显然路径被name覆盖了 增强了安全性

你可能感兴趣的:(Android,常见错误)