android7.0uri,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元素必须包含以下一个或者多个子元素:

files-path 对应目录Context.getFilesDir()

cache-path 对应目录Context.getCacheDir()

external-path 对应目录Environment.getExternalStorageDirectory()

external-files-path 对应目录Context,getExternalFilesDir(String) 或者Context.getExternalFilesDir(null)

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覆盖了 增强了安全性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值