不懂如何适配androidq拍照和读取相册图片??其实想解决这个问题也不难,下面让小编带着大家一起学习怎么去解决,希望大家阅读完这篇文章后大所收获。
google发行android q版本也有很长一段时间了,华为应用市场已经要求要适配android q版本了,所以,我们也要去对android q进行适配。
先讲一下咱们这节用到的新特性
- android q文件存储机制修改成了沙盒模式,类似于ios
- 应用只能访问自己沙盒下的文件和公共媒体文件
如果有想具体了解android q新版特效的可以去 官方文档
我们在这个地方记录一下android q版本进行拍照保存到相册的功能。
权限问题
android q不再需要申请文件读写权限,默认可以读写自己沙盒文件和公共媒体文件。因为相册属于公共媒体文件,所以,android q 可以不用 再动态申请权限。但是android q以下版本必须要申请权限才可以访问。
拍照
图片正常保存
拍照:android q之前版本使用的,将图片保存到指定文件夹,拍照完成后需要通知相册刷新
拍照代码
// 拍照存放路径 file filedir = new file(environment.getexternalstoragedirectory(), "pictures"); if (!filedir.exists()) { filedir.mkdir(); } //图片名称 string filename = "/img_" system.currenttimemillis() ".jpg"; //跳转到相机 intent intent = new intent(mediastore.action_image_capture); uri uri; //适配android n之后版本 if (build.version.sdk_int >= 24) { uri = fileprovider.geturiforfile(this, imagepickerprovider.getfileprovidername(this), new file(mfilepath)); } else { //适配android n版本之前 uri = uri.fromfile(new file(mfilepath)); } intent.putextra(mediastore.extra_output, uri); //跳转,需要在onactivityresult进行处理 startactivityforresult(intent, 1111);
刷新相册代码
sendbroadcast(new intent(intent.action_media_scanner_scan_file, uri.parse("file://" mfilepath)));
以上就是android q之前版本通用的拍照代码,有需要的可以直接复制就行
将图片保存到沙盒内
- 沙盒里面操作文件不再需要申请权限
- 沙盒中新建文件夹只能再系统指定的子文件夹中新建
android q版本使用,将图片存放到沙盒文件内,图库无法刷新,无法显示
// 获取图片沙盒文件夹 file pictures = getexternalfilesdir(environment.directory_pictures); //图片名称 mfilename = "img_" system.currenttimemillis() ".jpg"; //图片路径 mfilepath = pictures.getabsolutepath() "/" mfilename; //跳转到相机 intent intent = new intent(mediastore.action_image_capture); uri uri; if (build.version.sdk_int >= 24) { uri = fileprovider.geturiforfile(this, imagepickerprovider.getfileprovidername(this), new file(mfilepath)); } else { uri = uri.fromfile(new file(mfilepath)); } intent.putextra(mediastore.extra_output, uri); startactivityforresult(intent, 1111);
这个不用调用代码刷新相册库,因为刷新了也不能显示😁
仔细对比一下发现这两种基本上没有什么差别,只有文件存放路径不同,因为在android q新版本上对存储做出了改变。
将图片保存到公共文件夹
//------------------------- //拍照存放路径 //为了适配android q版本以下 file filedir = new file(environment.getexternalstoragedirectory(), "pictures"); if (!filedir.exists()) { filedir.mkdir(); } string filename = "/img_" system.currenttimemillis() ".jpg"; //-------------------------- //-------------------------- //设置参数 uri uri = null; // 设置保存参数到contentvalues中 contentvalues contentvalues = new contentvalues(); //设置文件名 contentvalues.put(mediastore.images.media.display_name, filename); //兼容android q和以下版本 if (build.version.sdk_int >= build.version_codes.q) { //android q中不再使用data字段,而用relative_path代替 //relative_path是相对路径不是绝对路径 //dcim是系统文件夹,关于系统文件夹可以到系统自带的文件管理器中查看,不可以写没存在的名字 contentvalues.put(mediastore.images.media.relative_path, "dcim/pictures"); } else { //android q以下版本 contentvalues.put(mediastore.images.media.data, mfilepath); } //设置文件类型 contentvalues.put(mediastore.images.media.mime_type, "image/jpeg"); //执行insert操作,向系统文件夹中添加文件 //external_content_uri代表外部存储器,该值不变 uri = getcontentresolver().insert(mediastore.images.media.external_content_uri, contentvalues); // 若生成了uri,则表示该文件添加成功 intent intent = new intent(mediastore.action_image_capture); intent.putextra(mediastore.extra_output, uri); startactivityforresult(intent, 1111);
使用这段代码也不用刷新相册库,会自动刷新。
存到公共文件的操作,相对来说麻烦点,但是也还好。
感谢你能够认真阅读完这篇文章,希望小编分享如何适配androidq拍照和读取相册图片?内容对大家有帮助,同时也希望大家多多支持本站,关注本站行业资讯频道,遇到问题就找本站,详细的解决方法等着你来学习!