Android Camera2 相机拍照流程详解
实现特点
- 实现自动对焦
- 选择性正常触发闪光灯flash
- 复用CaptureRequest.Builder, 参数完全一致
- 拍照注意事项讲解
- 代码片段详解
流程
- 按照常规方式打开预览
- 设置好相应的全局变量:
CameraDevice的cameraDevice
CameraCaptureSession的mPreviewSession
CaptureRequest.Builder的captureRequestBuilder
ImageReader的imageReader
等 - 定义一个类似takePicture()的开始拍照方法
- 自动对焦 对焦, 直接开始拍照, 调用类似captureStillPicture()的方法
- 自动对焦
// 设置自动对焦模式captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);captureRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
- 拍摄前, 如果需要闪光的, 需要设置
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
上面这条语句会触发闪光的开启动作
- 添加拍摄图片的输出
captureRequestBuilder.addTarget(mImageReader.getSurface());
- 设置当前的拍摄意图
captureRequestBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT, CameraMetadata.CONTROL_CAPTURE_INTENT_STILL_CAPTURE);
这条设置页会影响到闪光的正常开启. 如果不需要闪光灯的话, 设置了也没事.
- 设置图片的方向
因为物理相机的镜头方向可能和手机的朝向不一致(手机倒着拿), 所以设置这个是确保拍摄出来的图片永远是正向的
int sensorOrientation = mCameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);captureRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION,(sensorOrientation +mDisplayOrientation * (mFacing == Constants.FACING_FRONT ? 1 : -1) +360) % 360);
- 停止画面预览
mPreviewSession.stopRepeating();
也可以不调用这条, 不停止画面. 不过这样会出现闪光灯闪烁2次的问题.
- 开始拍照
mPreviewSession.capture(captureRequestBuilder.build(),new CameraCaptureSession.CaptureCallback() {@Overridepublic void onCaptureCompleted(@NonNull CameraCaptureSession session,@NonNull CaptureRequest request,@NonNull TotalCaptureResult result) {//移除输出到ImageReader, 不移除的话,会造成拍照停不下来的问题captureRequestBuilder.removeTarget(imageReader.getSurface());//恢复相机预提为预览captureRequestBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT, CameraMetadata.CONTROL_CAPTURE_INTENT_PREVIEW);try {//不加这句话, 闪光灯无法正常工作, 如果不适用闪光等, 可以不加mPreviewSession.capture(mPreviewRequestBuilder.build(), null, null);} catch (CameraAccessException e) {e.printStackTrace();}}}, null);
- 完整部分代码
/**拍照*/private void takePicture(){try{if (cameraDevice == null){return;}// 创建拍照请求captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);// 设置自动对焦模式captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);captureRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);// 将imageReader的surface设为目标captureRequestBuilder.addTarget(imageReader.getSurface());// 获取设备方向int rotation = getWindowManager().getDefaultDisplay().getRotation();// 根据设备方向计算设置照片的方向captureRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation));mCaptureRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 5);// 停止连续取景mPreviewSession.stopRepeating();mPreviewSession.abortCaptures();//拍照CaptureRequest captureRequest = captureRequestBuilder.build();//设置拍照监听mPreviewSession.capture(captureRequest,captureCallback, null);}catch (CameraAccessException e){e.printStackTrace();}}
Android Camera2 相机拍照流程详解相关推荐
- 十分钟实现 Android Camera2 相机拍照
1. 前言 因为工作中要使用Android Camera2 API,但因为Camera2比较复杂,网上资料也比较乱,有一定入门门槛,所以花了几天时间系统研究了下,并在CSDN上记录了下,希望能帮助到更 ...
- 详记Android打开相机拍照流程
写在前面 本文并不是基于Camera2的,所以想要了解Camera2的同学可以先散了.文题加了详记二字,因为相机整个打开的流程的确是比较复杂的,稍有疏忽可能就会引发一系列问题.我也是看了一下Andro ...
- Android Camera2相机使用流程讲解
引言 以前自己在APP端做自定义相机的时候,一般使用Camera1,通过camear.open+surfaceView的方式就可以很方便的实现效果.相机的拍照调用也比较方便.最近因为工作原因接触到an ...
- Camera2相机拍照流程之拍照功能梳理
/*** 拍照时调用方法*/ private void captureStillPicture() {try {if (mCameraDevice == null) {return;}// 创建作为拍 ...
- Android如何定时开机代码,Android定时开机的流程详解
一.原理 开(关)机原理,以低电平为例: 1.平时,电平为高 2.按下按键,电平为低: 3.电源管理(硬件PM)部分对低电平处理:低电平一直持续n秒,认为是开(关)机信号 4.进行开(关)机 要实现定 ...
- Android事件流程详解
Android事件流程详解 网络上有不少博客讲述了android的事件分发机制和处理流程机制,但是看过千遍,总还是觉得有些迷迷糊糊,因此特地抽出一天事件来亲测下,向像我一样的广大入门程序员详细讲述an ...
- Android App启动流程详解
前言:在之前的文章中已经写了apk的打包流程.安装流程,今天就是梳理一下apk系列的最后的流程--app启动流程.经过今天的梳理以后咱们就可以对apk包是怎么编译生成的.apk是怎么被安装到安卓手机的 ...
- android zygote启动流程,Android zygote启动流程详解
对zygote的理解 在Android系统中,zygote是一个native进程,是所有应用进程的父进程.而zygote则是Linux系统用户空间的第一个进程--init进程,通过fork的方式创建并 ...
- Android 开发 存储目录的详解
Android 开发 存储目录的详解 简介 Android设备,有3个地方的文件存储位置,他们分别是: 内部存储空间(用户无法浏览到此目录) 外部存储空间(就是手机自身的文件管理目录,用户可以浏览) ...
最新文章
- 动态修改属性设置 easyUI
- Mobile RDA 同步数据库的类--转
- maven的常见问题_Maven常见问题和陷阱
- LeetCode 1814. 统计一个数组中好对子的数目(哈希)
- OJ1077: 字符串加密(C语言)
- 曾经采集朋友圈难倒多少Python大佬,今天手把手教你如何实现!
- 二叉树的相关操作(c语言)
- PAT 1012 数字分类 (20)
- Lua重回TOP 20,TIOBE 3月编程语言排行榜出炉
- 电子设计大赛可以用linux开发板嘛,【一转再转】电子设计大赛应该怎么准备?...
- C/C++ isalpha、isalnum、islower、isupper函数详解
- 【ARM学习笔记】问题Processor ARM920T raised an exception.Cause:Undefined instruction的解决方法
- 艾司博讯:拼多多全店推广是什么意思?
- HDOJ 6608 Fansblog
- html5统计鼠标点击的次数,怎么实现js统计鼠标点击次数
- 我的世界java版1.12.2版_我的世界Minecraft Java版1.12.2 pre2 发布
- DM8168 - BT656格式视频采集
- [C题目]力扣876. 链表的中间结点
- PIC18F25K80芯片烧录方案(汽车诊断仪OBD-II,OBD2,ELM327 V1.5)
- C语言入门基础a++和++a的区别及运算符的优先级别
热门文章
- snort create mysql_安装Snort
- 男人“杀死”女人的30句话(zt)
- 关于做PDF的FAQ(一)~(四) 1
- 完全卸载office(手动卸载)、微软工具自动卸载、安装Office时提示错误1310、写入文件“GROOVEEX“时错误,请确认您有权限访问该目录
- JeecgBoot 3.4.4 版本发布,开源的企业级低代码平台
- 安装groovy时安照说明配置环境变量
- 微信小程序--开发者工具
- VS2010 MFC中对Access数据库基本操作
- 所有地区的中英文名称,手机区号,字母缩写(代码)json文件整理
- 剪视频到底要什么样的电脑配置?