Android日常开发 - Android7.0获取文件Uri
本文约3千字,新手阅读需要6分钟,复习需要3分钟 【收藏随时查阅不再迷路】
????关于作者
已经工作三年的95后程序员,坐标上海。平时在公司写Android原生App,业务时间会抽空学习Java后端,目标是成为全栈工程师,志同道合的可以私我聊聊haha。加入****快4年了,看了很多优秀作者的博客收获很多。后面的时间里,我写也会整理总结一些工作中使用到的知识分享出来。我的座右铭:人生在勤,不索何获。大家一起努力加油吧
????正文部分
众所周知,Android7.0之前获取文件的Uri直接调用(path)即可,生成的Uri是file://xx/xx,也就是文件的本地真实路径。Android7.0后不再允许传递本地真实路径,因为这样不安全,并且给出解决方案,使用FileProvider选择性地将封装过的Uri分享给外部,从而提供应用的安全性
1、新建一个file_paths.xml,在/res/xml目录下
这个文件的作用是用来指定共享路径
1、文件的根标签是paths,下面介绍了所有的子标签,平常使用选择一个子标签进行配置即可!
<paths>
<!--root-path对应根目录/,一般不需要配置-->
<root-path name="" path=""></root-path>
<!--files-path对应(),name属性会在uri中作为标识显示,如果name是my_image,生成uri一般是content:///my_image/filename;path表示共享的目录,如果是images/,表示共享()/images/-->
<files-path name="" path=""></files-path>
<!--cache-path对应(),name属性会在uri中作为标识显示,如果name是my_image,生成uri一般是content:///my_image/filename;path表示共享的目录,path表示共享的目录,如果是images/,表示共享()/images/-->
<cache-path name="" path=""></cache-path>
<!--external-files-path对应(),name属性会在uri中作为标识显示,如果name是my_image,生成uri一般是content:///my_image/filename;path表示共享的目录,path表示共享的目录,如果是images/,表示共享()/images/-->
<external-files-path name="" path=""></external-files-path>
<!--external-cache-path对应(),name属性会在uri中作为标识显示,如果name是my_image,生成uri一般是content:///my_image/filename;path表示共享的目录,path表示共享的目录,如果是images/,表示共享()/images/-->
<external-cache-path name="" path=""></external-cache-path>
<!--external-path对应(),name属性会在uri中作为标识显示,如果name是my_image,生成uri一般是content:///my_image/filename;path表示共享的目录,path表示共享的目录,如果是images/,表示共享()/images/-->
<external-path name="" path=""></external-path>
</paths>
2、配置一个具体的file_paths.xml文件
<?xml version="1.0" encoding="utf-8"?>
<paths>
<!--设置(Environment.DIRECTORY_PICTURES),也就是/storage/emulated/0/Pictures/为共享路径-->
<external-path name="my_image" path="Pictures/"/>
</paths>
2、AndroidManifest设置provider
<application>
<!--android:authorities写自己的包名.provider,记住它,在程序中会用到;其他的配置除了name如果用的v4包,要改成v4下的FileProvider以外,设置成以下配置即可-->
<provider
android:name=""
android:authorities=""
android:exported="false"
android:grantUriPermissions="true">
<!--设置共享路径的资源文件为上一步创建的文件-->
<meta-data
android:name=".FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
</application>
3、获取Uri
//创建一个File
File tempFile=File.createTempFile("file_test",".jpg",Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES));
//转为Uri
Uri uri = FileProvider.getUriForFile(this,"",tempFile);
4、一些补充
第一步的时候我们设置了共享路径path的name,我设置的是my_image;
第二步的时候我们设置了authorities,我设置的是;
第四步设置了文件名为file_test.jpg
那么最后生成的Uri是什么样的呢?
content:///my_image/file_test.jpg
总结一下:content://AndroidManifest中设置的authorities名/共享路径path的name/文件名