2019-08-26 适配最新6.0,7.0,8.0的系统相机和相册的功能

        公司项目中需要拍照和选择相册的功能,在此之前做过好几次,心里当时想,这么简单的功能几分钟搞定,嗯,就是这么自信,但是,但是,后续的事情简直让我怀疑人生,为什么这么说呢,因为,因为,现在相机要适配7.0,8.0了,我的天,想想马上出来10.0,我情不自禁的泪牛满面,w为什么Android开发会这么苦逼呢,好了,抱怨归抱怨,问题总要解决的嘛,下面带大家来爬坑吧。

        首先,我们思路就是直接调系统相机,所以,这点肯定是没错的,来看看代码,

这是调起系统相机的代码,发现什么没有,多了一个FileProvider啊,这是干什么的?带你看看官网描述:为了提高私有文件的安全性,防止私有文件的元数据泄漏,面向 Android 7.0 或更高版本的应用私有目录被限制访问。所以从 Android 7.0 开始,禁用file:// URI,而是需要通FileProvider生成content://URI去授予临时访问权限的方式实现应用间共享。所以这就是个contentProvider,Android7.0为了安全性能,现在统一用contentProvider来进行不同进程间的数据传递,那么我我们首先需要申明一个contentProvider,怎么声明,我们只需要在res资源文件创建一个xml包,然后在里面创建一个文件,根元素是path,如图

接下来为大家说明每个属性对应申明,首先files-path代表的是文件名  后面path代表路径,cache-path代表缓存文件名,后面path代表缓存路径,external-path代表外部存储名,后面对应的是路径,同理external-files-path代表外部文件名 ,external-cache-path代表外部缓存文件。配置好了之后,我们回到上面调用相机的代码,

看上图可知,需要添加provider来获取拍照后的图片的uri,这个跟低版本的获取是不一样的。图库选择图片是不变的,这个不存在变化 的,下面看看调用系统图库的功能

这个没什么好说的,还有一点,我们上传服务器一般以文件file形式上传的 ,那么我们还需要将我们获取的uri转换成file文件形式。

这个实际上就是查询存储的路径,查询存储的文件,根据uri和路径获取cursor,然后查询所有列,获取到所有的path,根据path获取到file文件。

拍照和从图库中选择图片的功能都完成了,那么肯定会对图片进行裁剪,那么来看看7.0以上的裁剪和之前有什么区别呢,

从我框起来的看看,如果直接拍照,那么裁剪后的图片的uri就是直接通过拍照保存图片的file转成uri的,如果从相册中玄策的图片的话,先获取选择的图片的路径,然后转成file,通过uri.fromFile转成裁剪后的图片uri。然后再调起系统的裁剪功能。以上的步骤其实没多大区别,但是我们需要注意的是拍照中数据传递的变化。

你可能感兴趣的:(2019-08-26 适配最新6.0,7.0,8.0的系统相机和相册的功能)