实现特点

  • 实现自动对焦
  • 选择性正常触发闪光灯flash
  • 复用CaptureRequest.Builder, 参数完全一致
  • 拍照注意事项讲解
  • 代码片段详解

流程

  1. 按照常规方式打开预览
  2. 设置好相应的全局变量:
    CameraDevice的cameraDevice
    CameraCaptureSession的mPreviewSession
    CaptureRequest.Builder的captureRequestBuilder
    ImageReader的imageReader
  3. 定义一个类似takePicture()的开始拍照方法
  4. 自动对焦 对焦, 直接开始拍照, 调用类似captureStillPicture()的方法
  5. 自动对焦
 // 设置自动对焦模式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);
  1. 拍摄前, 如果需要闪光的, 需要设置
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);

上面这条语句会触发闪光的开启动作

  1. 添加拍摄图片的输出
captureRequestBuilder.addTarget(mImageReader.getSurface());
  1. 设置当前的拍摄意图
captureRequestBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT, CameraMetadata.CONTROL_CAPTURE_INTENT_STILL_CAPTURE);

这条设置页会影响到闪光的正常开启. 如果不需要闪光灯的话, 设置了也没事.

  1. 设置图片的方向
    因为物理相机的镜头方向可能和手机的朝向不一致(手机倒着拿), 所以设置这个是确保拍摄出来的图片永远是正向的
 int sensorOrientation = mCameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);captureRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION,(sensorOrientation +mDisplayOrientation * (mFacing == Constants.FACING_FRONT ? 1 : -1) +360) % 360);
  1. 停止画面预览
mPreviewSession.stopRepeating();

也可以不调用这条, 不停止画面. 不过这样会出现闪光灯闪烁2次的问题.

  1. 开始拍照
  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);
  1. 完整部分代码
 /**拍照*/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 相机拍照流程详解相关推荐

  1. 十分钟实现 Android Camera2 相机拍照

    1. 前言 因为工作中要使用Android Camera2 API,但因为Camera2比较复杂,网上资料也比较乱,有一定入门门槛,所以花了几天时间系统研究了下,并在CSDN上记录了下,希望能帮助到更 ...

  2. 详记Android打开相机拍照流程

    写在前面 本文并不是基于Camera2的,所以想要了解Camera2的同学可以先散了.文题加了详记二字,因为相机整个打开的流程的确是比较复杂的,稍有疏忽可能就会引发一系列问题.我也是看了一下Andro ...

  3. Android Camera2相机使用流程讲解

    引言 以前自己在APP端做自定义相机的时候,一般使用Camera1,通过camear.open+surfaceView的方式就可以很方便的实现效果.相机的拍照调用也比较方便.最近因为工作原因接触到an ...

  4. Camera2相机拍照流程之拍照功能梳理

    /*** 拍照时调用方法*/ private void captureStillPicture() {try {if (mCameraDevice == null) {return;}// 创建作为拍 ...

  5. Android如何定时开机代码,Android定时开机的流程详解

    一.原理 开(关)机原理,以低电平为例: 1.平时,电平为高 2.按下按键,电平为低: 3.电源管理(硬件PM)部分对低电平处理:低电平一直持续n秒,认为是开(关)机信号 4.进行开(关)机 要实现定 ...

  6. Android事件流程详解

    Android事件流程详解 网络上有不少博客讲述了android的事件分发机制和处理流程机制,但是看过千遍,总还是觉得有些迷迷糊糊,因此特地抽出一天事件来亲测下,向像我一样的广大入门程序员详细讲述an ...

  7. Android App启动流程详解

    前言:在之前的文章中已经写了apk的打包流程.安装流程,今天就是梳理一下apk系列的最后的流程--app启动流程.经过今天的梳理以后咱们就可以对apk包是怎么编译生成的.apk是怎么被安装到安卓手机的 ...

  8. android zygote启动流程,Android zygote启动流程详解

    对zygote的理解 在Android系统中,zygote是一个native进程,是所有应用进程的父进程.而zygote则是Linux系统用户空间的第一个进程--init进程,通过fork的方式创建并 ...

  9. Android 开发 存储目录的详解

    Android 开发 存储目录的详解 简介 Android设备,有3个地方的文件存储位置,他们分别是: 内部存储空间(用户无法浏览到此目录) 外部存储空间(就是手机自身的文件管理目录,用户可以浏览) ...

最新文章

  1. 动态修改属性设置 easyUI
  2. Mobile RDA 同步数据库的类--转
  3. maven的常见问题_Maven常见问题和陷阱
  4. LeetCode 1814. 统计一个数组中好对子的数目(哈希)
  5. OJ1077: 字符串加密(C语言)
  6. 曾经采集朋友圈难倒多少Python大佬,今天手把手教你如何实现!
  7. 二叉树的相关操作(c语言)
  8. PAT 1012 数字分类 (20)
  9. Lua重回TOP 20,TIOBE 3月编程语言排行榜出炉
  10. 电子设计大赛可以用linux开发板嘛,【一转再转】电子设计大赛应该怎么准备?...
  11. C/C++ isalpha、isalnum、islower、isupper函数详解
  12. 【ARM学习笔记】问题Processor ARM920T raised an exception.Cause:Undefined instruction的解决方法
  13. 艾司博讯:拼多多全店推广是什么意思?
  14. HDOJ 6608 Fansblog
  15. html5统计鼠标点击的次数,怎么实现js统计鼠标点击次数
  16. 我的世界java版1.12.2版_我的世界Minecraft Java版1.12.2 pre2 发布
  17. DM8168 - BT656格式视频采集
  18. [C题目]力扣876. 链表的中间结点
  19. PIC18F25K80芯片烧录方案(汽车诊断仪OBD-II,OBD2,ELM327 V1.5)
  20. C语言入门基础a++和++a的区别及运算符的优先级别

热门文章

  1. snort create mysql_安装Snort
  2. 男人“杀死”女人的30句话(zt)
  3. 关于做PDF的FAQ(一)~(四) 1
  4. 完全卸载office(手动卸载)、微软工具自动卸载、安装Office时提示错误1310、写入文件“GROOVEEX“时错误,请确认您有权限访问该目录
  5. JeecgBoot 3.4.4 版本发布,开源的企业级低代码平台
  6. 安装groovy时安照说明配置环境变量
  7. 微信小程序--开发者工具
  8. VS2010 MFC中对Access数据库基本操作
  9. 所有地区的中英文名称,手机区号,字母缩写(代码)json文件整理
  10. 剪视频到底要什么样的电脑配置?