适配AndroidQ拍照和读取相册图片的实现方法
时间:2022-07-27
本文章向大家介绍适配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拍照和读取相册图片的实现方法的文章就介绍到这了,更多相关AndroidQ拍照和读取相册图片内容请搜索ZaLou.Cn以前的文章或继续浏览下面的相关文章希望大家以后多多支持ZaLou.Cn!
- git push上传代码到gitlab上,报错401/403(或需要输入用户名和密码)
- mysql下mysqladmin日常管理命令总结
- Ubuntu下SVN安装和配置
- mysql表名忽略大小写问题记录
- 当wcf遇到JSON ?
- 从MapX到MapXtreme2004[2]-图层操作
- Nginx+keepalived双机热备(主主模式)
- 用正则表达式完成简单公式的替换计算
- Linux下误删除后的恢复操作(ext3/ext4)
- 部署Linux下的man慢查询中文帮助手册环境
- 想修改CSS
- linux下sendmail邮件系统安装操作记录
- 定时备份脚本分享(网站数据和数据库数据)
- 大型分布式服务器架构原理解析
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Spring Boot 实现员工信息管理demo
- 如何把 Flutter 云端一体化做到极致?
- 微服务[学成在线] day16:基于Spring Security Oauth2开发认证服务
- 新的跨域策略:使用COOP、COEP为浏览器创建更安全的环境
- CVE-2020-1948:Dubbo Provider默认反序列化复现
- R语言进阶之因子分析
- Spring Boot 整合Thymeleaf
- Spring Boot 整合Shiro
- 微服务[学成在线] day01:CMS接口开发
- 微服务[学成在线] day02:CMS前端开发
- ggplot2| 绘制KEGG气泡图
- 微服务[学成在线] day03:CMS页面管理开发
- ggplot2|绘制GO富集柱形图
- 使用Prometheus监控Flink
- 微服务[学成在线] day04:页面静态化