以geekcamera为例,当关闭闪光灯时,flash mode = 0,代表flash为off模式;
ae mode = 1,代表ae为off模式,flash state = 2,代表flash处于 ready状态,表示没有打闪。

当闪光灯设置为auto时,是通过设置ae mode 控制的。flash mode = 0,代表flash为off模式;
ae mode = 2,代表ae为on模式,flash state = 2,代表flash处于 ready状态,表示没有打闪;flash state = 3,代表flash处于 fired状态,表示打闪了。

具体代码逻辑

switch(flash_value) {case "flash_off":builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);break;case "flash_auto":// note we set this even in fake flash mode (where we manually turn torch on and off to simulate flash) so we// can read the FLASH_REQUIRED state to determine if flash is required/*if( use_fake_precapture || CameraController2.this.want_expo_bracketing )builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);else*/builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH);//这里FLASH_MODE可以设置为任意值,因为AE_MODE优先级高builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);break;case "flash_on":// see note above for "flash_auto" for why we set this even fake flash mode - arguably we don't need to know// about FLASH_REQUIRED in flash_on mode, but we set it for consistency.../*if( use_fake_precapture || CameraController2.this.want_expo_bracketing )builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);else*/builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_ALWAYS_FLASH);builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);break;case "flash_torch":builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);break;case "flash_red_eye":// not supported for expo bracketing or burstif( CameraController2.this.burst_type != BurstType.BURSTTYPE_NONE )builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);elsebuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE);builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);break;case "flash_frontscreen_auto":case "flash_frontscreen_on":case "flash_frontscreen_torch":builder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);break;
}

只要flash mode不是auto,并且需要打闪的时候,就需要做预闪(precapture)

boolean needs_flash = capture_result_ae != null && capture_result_ae != CaptureResult.CONTROL_AE_STATE_CONVERGED;
if( camera_settings.flash_value.equals("flash_auto") && !needs_flash ) {// if we call precapture anyway, flash wouldn't fire - but we tend to have a pause// so skipping the precapture if flash isn't going to fire makes this fasterif( MyDebug.LOG )Log.i(TAG, "flash auto, but we don't need flash");call_takePictureAfterPrecapture = true;
}
else {call_runPrecapture = true;
}if( call_runPrecapture ) {runPrecapture();
}

runPrecapture逻辑

runPrecapture() {final CaptureRequest.Builder precaptureBuilder = mCameraDevice.createCaptureRequest(previewIsVideoMode ? CameraDevice.TEMPLATE_VIDEO_SNAPSHOT : CameraDevice.TEMPLATE_STILL_CAPTURE);precaptureBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT, CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE);camera_settings.setupBuilder(precaptureBuilder, false);precaptureBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_IDLE);precaptureBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CameraMetadata.CONTROL_AE_PRECAPTURE_TRIGGER_IDLE);precaptureBuilder.addTarget(getPreviewSurface());state = STATE_WAITING_PRECAPTURE_START;precapture_state_change_time_ms = System.currentTimeMillis();// first set precapture to idle - this is needed, otherwise we hang in state STATE_WAITING_PRECAPTURE_START, because precapture already occurred whilst autofocusing, and it doesn't occur again unless we first set the precapture trigger to idleif( MyDebug.LOG )Log.i(TAG, "capture with precaptureBuilder");captureSession.capture(precaptureBuilder.build(), previewCaptureCallback, handler);captureSession.setRepeatingRequest(precaptureBuilder.build(), previewCaptureCallback, handler);// now set precaptureprecaptureBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CameraMetadata.CONTROL_AE_PRECAPTURE_TRIGGER_START);captureSession.capture(precaptureBuilder.build(), previewCaptureCallback, handler);
}

这里将state 设置为了STATE_WAITING_PRECAPTURE_START,当captureSession.capture()调用完后,会执行到CameraCaptureSession的回调函数onCaptureCompleted(),在此回调函数中我们需要判断AE的状态是否等于CaptureResult.CONTROL_AE_STATE_PRECAPTURE,如果等于,那么执行takePictureAfterPrecapture()
takePictureAfterPrecapture()的逻辑

takePictureAfterPrecapture(){stillBuilder = mCameraDevice.createCaptureRequest(previewIsVideoMode ? CameraDevice.TEMPLATE_VIDEO_SNAPSHOT : CameraDevice.TEMPLATE_STILL_CAPTURE);stillBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT, CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE);stillBuilder.setTag(new RequestTagObject(RequestTagType.CAPTURE));camera_settings.setupBuilder(stillBuilder, true);stillBuilder.addTarget(imageReader.getSurface());captureSession.capture(stillBuilder.build(), previewCaptureCallback, handler);playSound(MediaActionSound.SHUTTER_CLICK);
}

Android Camera AE和AF的设置相关推荐

  1. Android Camera设置setPreviewCallback实现onPreviewFrame接口实时截取每一帧视频流数据

    1 概述 通过Android Camera拍摄预览中设置setPreviewCallback实现onPreviewFrame接口,实时截取每一帧视频流数据 2 知识点 ① Android Camera ...

  2. 【Android RTMP】Android Camera 视频数据采集预览 ( 图像传感器方向设置 | Camera 使用流程 | 动态权限申请 )

    文章目录 安卓直播推流专栏博客总结 一. Camera 传感器方向简介 二. Camera 图像传感器横向显示数据 三. Camera 图像传感器纵向显示数据 四. 设置 Camera 预览数据方向 ...

  3. 【Android RTMP】Android Camera 视频数据采集预览 ( 视频采集相关概念 | 摄像头预览参数设置 | 摄像头预览数据回调接口 )

    文章目录 安卓直播推流专栏博客总结 一. Android 端数据采集涉及到的相关概念 二. Camera 预览图像尺寸设置 三. 获取摄像头采集的数据格式 安卓直播推流专栏博客总结 Android R ...

  4. Android Camera开发系列:设置对焦模式模式

    你对android camera的对焦模式熟悉吗? 知道什么场景下该设置哪种对焦模式吗? 本文针对下面2点展开介绍,和大家一起学习~ 一.有哪几种对焦模式? 二.如何使用各种对焦模式? 一.有哪几种对 ...

  5. android camera(6)---camera2 拍照流程

    android camera2 拍照流程 正文 camera2 API 的加入是从AndroidV5.0(21)开始的,因此我们使用Camera2应该是在Android 5.0(含5.0)之后.同时, ...

  6. Android camera闪光灯

    两种工作模式: Camera flash led分flash和torch两种模式. Flash: 拍照时闪光灯瞬间亮一下的情况,电流比较大,目前是1000mA,最大电流不能超过led的最大承受能力. ...

  7. Android Camera 开发常见专业术语名词解释

    Android Camera 开发常见专业术语名词解释 参考网址:http://m.blog.csdn.net/king1425/article/details/62224468 相机常见专业术语名词 ...

  8. Android Camera了解一下

    首发于公众号 Android Camera了解一下 Camera 演进简介 最近在项目中遇到 Camera相关的场景,之前对这块不是很了解,趁机补了一下盲区.Android Camera 相关也是生态 ...

  9. Camera HAL3学习: Android Camera System

    Android Camera硬件抽象层(HAL,Hardware Abstraction Layer)主要用于把底层camera drive与硬件和位于android.hardware中的framew ...

最新文章

  1. MonoRec:无需激光雷达,只需单个相机就可以实现三维场景的稠密重建
  2. dedecms织梦移站后替换数据库中文件路径命令
  3. 中判断字符串是否为空_leetcode1704_go_判断字符串的两半是否相似
  4. OpenWrt安装迅雷成功,实现BT emule等多协议下载
  5. P4768 [NOI2018] 归程(kruskal 重构树)
  6. UVALive 4394 String painter
  7. 满满干货!mysql无法修改表的数据
  8. C++中使用模板,new创建2维动态数组
  9. 自适应输出表格(ASP版)
  10. EFM32片内外设--TFT 汉字字库
  11. 最小二乘法 c 语言程序,最小二乘法的嵌入式C语言实现
  12. Eclipse 2020如何创建JAVA Web项目
  13. 中科大计算机考研录取分数线_计算机专业学校考研难度排行榜 计算机考研难度排名...
  14. 【linux】运行run文件显示cannot execute binary file
  15. windows 下如何让一个窗口置顶?
  16. python游戏代码怎样才能玩好英雄联盟_怎样才能玩好英雄联盟-百度经验
  17. Android 音频源码分析——AndroidRecord录音(一)
  18. 思考:你的工作是否有反脆弱性?
  19. CH340C的ESP8266一键下载电路设计
  20. 播放视频 unity使用rawimage控制视频,包括暂停,继续,跳过等;调整视频尺寸,解决视频无声音的情况

热门文章

  1. 流形manifold
  2. python和易语言抓包_易语言调用抓包工具 易语言网页抓包教程
  3. 最近工商银行钓鱼网站井喷式增长,过年了小心被钓鱼
  4. 共同战“疫” 哈啰出行多举措保障用户复工复产
  5. html5中audio标签
  6. js 比较时间的大小
  7. 卸载BlackIce的过程
  8. 如何消除proteus仿真时的红蓝色点(高低电平显示点)
  9. 怎么用ps提取图片颜色分析色彩搭配
  10. Corona豪宅建筑表现作品欣赏