CONTROL_MODE
在API级别21中添加
公共静态最终Key CONTROL_MODE
3A(自动曝光,自动白平衡,自动对焦)控制例程的整体模式。

这是顶级3A控制开关。设置为OFF时,将禁用照相机设备的所有3A控制。应用程序必须设置捕获参数本身的字段。

设置为AUTO时,android.control。*中的单个算法控件有效,例如CaptureRequest#CONTROL_AF_MODE。

当设置为USE_SCENE_MODE或USE_EXTENDED_SCENE_MODE时,android.control。*中的各个控件通常被禁用,并且摄像头设备根据需要实现场景模式或扩展场景模式设置(例如ACTION,SUNSET,PARTY或BOKEH)之一。相机设备场景模式3A设置由捕获结果提供。

当设置为OFF_KEEP_STATE时,它类似于OFF模式,唯一的区别是相机设备后台3A统计信息更新将不会使用此帧,就好像从未捕获此帧一样。在应用程序不希望3A手动控件捕获影响后续的3A自动捕获结果的情况下,可以使用此模式。

可能的值:

  • OFF
  • AUTO * Use settings for each individual 3A routine. besides sceneMode take effect.
  • USE_SCENE_MODE
  • OFF_KEEP_STATE
  • USE_EXTENDED_SCENE_MODE

CONTROL_SCENE_MODE
在API级别21中添加
公共静态最终Key CONTROL_SCENE_MODE
控制当前哪个场景模式处于活动状态。

场景模式是针对特定条件和拍摄设置优化的自定义相机模式。

当CaptureRequest#CONTROL_MODE == USE_SCENE_MODE时,此模式是活动的。 除了FACE_PRIORITY之外,这些模式还将在使用时禁用CaptureRequest#CONTROL_AE_MODE,CaptureRequest#CONTROL_AWB_MODE和CaptureRequest#CONTROL_AF_MODE。

这些场景模式的解释和实现留给相机设备的实现者。 它们的行为在所有设备上都不一致,并且任何给定的设备都只能实现这些模式的子集。

谷歌的场景模式,这种模式是针对特定条件和拍摄设置优化的自定义相机模式。当设置为USE_SCENE_MODE或USE_EXTENDED_SCENE_MODE时,android.control。*中的各个控件通常被禁用,即也与三A冲突,因为三A是有自己的算法处理,场景也有自己特定的算法,哪些条件下才符合场景。我们相机使用到的场景不是谷歌的,与三A不冲突

CONTROL_AE_MODE
在API级别21中添加
公共静态最终Key CONTROL_AE_MODE
相机设备自动曝光程序的所需模式。

仅当CaptureRequest#CONTROL_MODE为AUTO时此控件才有效。(CONTROL_MODE默认为AUTO,可以不特意设置CONTROL_MODE来使用其他模式)

CONTROL_MODE When set to AUTO, the individual algorithm controls in android.control.* are in effect, such as CaptureRequest#CONTROL_AF_MODE.
由于底层由很多计算的算法,CONTROL_MODE 的不同value对应不同的算法,使用AUTO时其他control.*可以使用

当设置为任何ON模式时,将启用相机设备的自动曝光例程,从而覆盖应用程序选择的曝光时间,传感器灵敏度和帧时长(CaptureRequest#SENSOR_EXPOSURE_TIME,CaptureRequest#SENSOR_SENSITIVITY和CaptureRequest#SENSOR_FRAME_DURATION)。如果选择了其中一种闪光模式,相机设备的闪光单元控制也会被覆盖。

仅当相机设备具有闪光灯组件(CameraCharacteristics#FLASH_INFO_AVAILABLE为true)时,闪光灯模式才可用。

如果需要闪存TORCH模式,则必须将此字段设置为ON或OFF,并且CaptureRequest#FLASH_MODE设置为TORCH。

当设置为任何ON模式时,相机设备自动曝光例程为给定捕获的覆盖字段选择的值将在其CaptureResult中可用。

可能的值:

OFF
ON : The application has control over the various android.flash. fields.该应用程序可以控制各种android.flash。*字段。*
ON_AUTO_FLASH : 与ON一样,不同之处在于相机设备还控制相机的闪光灯,并在弱光条件下闪光。 闪光灯可能会在预捕获序列期间触发(由CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER触发)
ON_ALWAYS_FLASH : 闪光灯可能会在预捕获序列期间触发
ON_AUTO_FLASH_REDEYE : 类似于ON_AUTO_FLASH,但具有自动防红眼功能。
ON_EXTERNAL_FLASH
该设备的可用值:
摄影机特性#CONTROL_AE_AVAILABLE_MODES

FLASH_MODE
在API级别21中添加
公共静态最终Key FLASH_MODE
相机设备的闪光灯控制所需的模式。

仅当有闪光灯组件可用时,此控件才有效(CameraCharacteristics#FLASH_INFO_AVAILABLE == true)。

使用此控件时,必须将CaptureRequest#CONTROL_AE_MODE设置为ON或OFF。否则,与相机设备自动曝光相关的闪光控制(ON_AUTO_FLASH,ON_ALWAYS_FLASH或ON_AUTO_FLASH_REDEYE)将覆盖此控制。

当flash和AE一起设置,AE设置优先于FLASH_MODE,AE设置的值会把FLASH_MODE的所有由FLASH设置的覆盖掉,AE有5种value,如果不设置on,off,则其他的value会覆盖flash——mode

previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
previewRequestBuilder.set(CaptureRequest.FLASH_MODE,CameraMetadata.FLASH_MODE_TORCH);  
//preview的builder设置了torch,结果由于没有设置on,off,设置为了CONTROL_AE_MODE_ON_ALWAYS_FLASH,所以flash失效
previewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
//由于ON_AUTO_FLASH 和 ON_ALWAYS_FLASH只有预拍设置即可才能触发,设置预拍后触发覆盖了flash_mode的torch

结果没有闪光灯出现
previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_OFF);
//previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);
previewRequestBuilder.set(CaptureRequest.FLASH_MODE,CameraMetadata.FLASH_MODE_TORCH);
previewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
 预览闪光灯持续打开

当设定为OFF时,相机将不会为该拍摄闪光。

设置为SINGLE时,无论相机设备的自动曝光例行结果如何,相机设备都会闪光。在静态拍摄情况下使用时,此控件应与自动曝光(AE)预拍摄测光序列(CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER)一起使用,否则,图像可能会被错误地曝光。

当设定为TORCH时,闪光灯将连续点亮。此模式可用于诸如预览,自动对焦辅助,静止捕捉或视频录制等使用情况。

闪存状态将由CaptureResult#FLASH_STATE在捕获结果元数据中报告。

可能的值:

OFF
SINGLE
TORCH
该密钥在所有设备上均可用。

SINGLE:如果闪光灯可用且已充电,请为该拍摄闪光。 (弱光)

TORCH:过渡闪光持续点亮。

CONTROL_AE_PRECAPTURE_TRIGGER
在API级别21中添加
公共静态最终键 CONTROL_AE_PRECAPTURE_TRIGGER
摄像头设备在处理此请求时是否将触发预捕获测光序列。

该条目通常设置为IDLE,或者根本不包含在请求设置中。包括在内并设置为START时,相机设备将触发自动曝光(AE)预捕获测光序列。

当设置为CANCEL时,相机设备将取消任何活动的预捕获测光触发,并返回其初始AE状态。如果预捕获的测光序列已经完成,并且摄像头设备已隐式锁定了AE以进行后续的静态捕获,则CANCEL触发器将解锁AE并返回其初始AE状态。

当启用闪光灯时,应在开始进行高质量的静态捕获之前触发预捕获序列,以做出最终的测光决策,并触发预捕获的闪光脉冲以估计场景亮度和所需的最终捕获闪光功率。

通常,对于单个请求,该条目应设置为START,并且应用程序应等待序列完成,然后再开始新的请求。

自动曝光(AE)预捕获触发器的确切效果取决于当前的AE模式和状态。有关AE预捕获状态转换的详细信息,请参见CaptureResult#CONTROL_AE_STATE。

在LEGACY级别的设备上,不支持预捕获触发器。捕获高分辨率JPEG图像将在高分辨率捕获之前自动触发预捕获序列,包括可能触发预捕获闪光灯。

允许同时使用预捕获触发器和自动聚焦触发器CaptureRequest#CONTROL_AF_TRIGGER。但是,由于这些触发器通常需要自动聚焦和自动曝光例程之间的配合(例如,可能需要启用聚焦扫描),因此相机设备可能会延迟对后一个触发器的作用,直到之前的触发器被触发为止。充分处理。例如,这可能会导致触发器之间的间隔更长,并且导致CaptureResult#CONTROL_AE_STATE的更改指示预捕获序列的开始。

如果预捕获和自动聚焦触发器均在同一请求上被激活,则相机设备将以该设备的最佳顺序完成它们。

可能的值:


开始
取消
可选-此键的值在某些设备上可能为null。

有限的功能-在所有报告为至少具有CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED设备上的CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL键中的设备上

一、AUTO模式(弱光下打开闪光灯)CONTROL_AE_MODE_ON_AUTO_FLASH

预览builder:

previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_ALWAYS_FLASH);
previewRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CameraMetadata.CONTROL_AE_PRECAPTURE_TRIGGER_START);
//给预览的surface请求,让它给CONTROL_AE_MODE设定值CONTROL_AE_MODE_ON_AUTO_FLASH,控制闪光灯,底层会时刻计算处理AE的值
//CONTROL_AE_PRECAPTURE_TRIGGER设定为CONTROL_AE_PRECAPTURE_TRIGGER_START,预拍的请求,当预拍时会再次更新AE,

二、CONTROL_AE_MODE_ON:

多种实现,核心是拍照时把flash_mode设置为打开闪光灯

1、builder.set(CaptureRequest.FLASH_MODE,CameraMetadata.FLASH_MODE_SINGLE); // 由flash_mode自己控制
2、builder.set(CaptureRequest.FLASH_MODE,CameraMetadata.FLASH_MODE_TORCH); // flash的强光模式
3、builder.set(CaptureRequest.FLASH_MODE,CameraMetadata.CONTROL_AE_MODE_ON); //由AE控制

三、持续打开闪光灯

1、previewRequestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);  //持续开启
2、previewRequestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_SINGLE);  //使用闪光灯控制曝光效果很差,使用AE来控制