Android camera---Camera2详解之一 API学习

Camera2的API出来有些年头了,只是赶项目多次使用,没时间好好总结,年终了,正好结合google的官方Camera2demo 和开发中使用的情况,做个详细梳理,研究总结之后,才发现Camera2并非想象的难用,充分理解相关几个类之后,实现自己需求还是很简单的。

该篇详细介绍Camera2相关的类,根据API各个类的方法,字段含义都详细用表格记录。 
下一篇将介绍Camera2的使用流程。

<一>SurfaceView 相关的类

在Camera的时候,自定义相机预览首选 SurfaceView当展示布局,更深层的结合openCV openGL库的GLSurfaceView,做渲染滤镜游戏动画等。首先了解相关类SurfaceView和SurfaceHolder的API。

<1>SurfaceView API

当SurfaceView窗口可见时,就可以创建这个表面,当urfaceView展示或者隐藏时,需要对它进行创建和销毁,你就需要实现SurfaceViewCreated(SurfaceHolder)方法或者SurfaceViewDestroyed(SurfaceHolder)方法。 
这个类的用途之一就是提供了一个可以在屏幕上显示辅助线程的Surface,要使用,需要了解线程语义:回调方法Callback将从运行的SurfceView窗口调用,所以需要正确的同步绘制线程。在SurfaceHolder.Callback.surfaceCreated() 方法和 SurfaceHolder.Callback.surfaceDestroyed()方法之间是有效的期间,你必须确保绘图线程只和使用的SurfaceView有联系。 
注意:从android7.0开始,SurfaceView的窗口位置与其他视图呈现同步更新。这意味着在屏幕上平移和缩放一个SurfaceView将不会导致呈现工件

public方法解释
void draw(Canvas canvas)手动的将各种view渲染到给定的画布上
boolean gatherTransparentRegion(Region region)当视图层次结构包含一个或多个SurfaceView时,RootView使用它来执行优化。
SurfaceHolder getHolder()返回SurfaceHolder,用于访问和控制SurfaceView
void setSecure(boolean isSecure)控制表面视图的内容是否应该被视为安全的,防止它出现在屏幕截图中或在非安全显示中被查看。注意,必须在窗口管理器的窗口视图包含窗口之前设置此设置。
void setVisibility(int visibility)surfaceView可见设置
void setZOrderMediaOverlay(boolean isMediaOverlay)surfaceView1是否被放置在另一个surfaceView2视图上
setZOrderOnTop(boolean onTop)在自己的window内,设置最顶层显示

protected的方法

protected方法解释
void dispatchDraw(Canvas canvas)由draw调用绘制子view
void onAttachedToWindow()视图view依附到window上被触发
void onDetachedFromWindow()视图view从window上分离被触发
onMeasure(int widthMeasureSpec, int heightMeasureSpec)绘制view的宽高
onWindowVisibilityChanged(int visibility)在视图持续可见和不可见变化时触发

<2> SurfaceHolder API

返回值(abstract)方法解释
voidaddCallback(SurfaceHolder.Callback callback)为整个holder添加回调接口
SurfacegetSurface()直接访问surface对象
RectgetSurfaceFrame()获取surface的尺寸大小
booleanisCreating()使用这个方法来找出是否在从回调方法创建的过程中。
CanvaslockCanvas()开始编辑surface的像素
voidunlockCanvasAndPost(Canvas canvas)结束编辑surface像素
CanvaslockCanvas(Rect dirty)开始编辑surface的像素,但是允许特殊矩形
default CanvaslockHardwareCanvas()开始编辑surface的像素,但是返回的画布是硬件加速的
voidremoveCallback(SurfaceHolder.Callback callback)从holder移除回调接口
voidsetFixedSize(int width, int height)修改surface 尺寸
voidsetFormat(int format)设置surface的像素格式 格式:PixelFormat
abstract voidsetKeepScreenOn(boolean screenOn)启用或禁用选项,以便在显示该界面时打开屏幕。
voidsetSizeFromLayout()允许Surface根据其容器的布局调整大小

<3> SurfaceHolder.Callback接口

重写方法解释
surfaceChanged(SurfaceHolder holder, int format, int width, int height)surface改变回调
surfaceCreated(SurfaceHolder holder)surface第一次创建就回调
surfaceDestroyed(SurfaceHolder holder)surface销毁回调

<二>Camera2 相关的类

android5.0之后支持的API,主要功能都在android.hardware.camera2中。相关的类有: 
1:CameraManager(以及两个回调 AvailabilityCallbackTorchCallback
2:CameraDevice(以及回调StateCallback
3:CameraCaptureSession(以及两个回调:CaptureCallbackStateCallback
4:CaptureRequest(以及CaptureRequest.Builder类)+CaptureResult+TotalCaptureResult+CameraCharacteristics,这四个类都继承了基类CameraMetadata 
5:接收数据类android.media.ImageReader 
6:xml布局类:TextureView (google demo推荐)或SurfaceView

<1>CameraManager

官方文档解释: 
一种系统服务管理器,用于检测、描述和连接到照相机设备。 
获取该实例的方法:CameraManager manager =(CameraManager)Context.getSystemService(Context.CAMERA_SERVICE);或者 
CameraManager manager =(CameraManager)Context. getSystemService(CameraManager.class);

返回值方法名解释
CameraCharacteristicsgetCameraCharacteristics(String cameraId)查询摄像机设备的功能。
String[]getCameraIdList()通过标识符返回当前连接的相机设备的列表,包括可能被其他相机API客户端使用的相机。
 openCamera(String cameraId, CameraDevice.StateCallback callback, Handler handler)打开一个带有给定ID的相机的连接。
 registerAvailabilityCallback(CameraManager.AvailabilityCallback callback, Handler handler)注册一个回调,以获得关于相机设备可用性的通知。
 registerTorchCallback(CameraManager.TorchCallback callback, Handler handler)注册一个回调,以获得关于torch mode状态的通知。
 setTorchMode(String cameraId, boolean enabled)在不打开相机设备的情况下,设置闪光灯的闪光灯模式。
 unregisterAvailabilityCallback(CameraManager.AvailabilityCallback callback)删除之前添加的回调,回调将不再接收连接和断开回调。
 unregisterTorchCallback(CameraManager.TorchCallback callback)删除之前添加的回调,回调将不再接收torch mode状态回调。

<1-1>CameraManager.AvailabilityCallback

CameraManager的内部类AvailabilityCallback回调,官方文档解释:

一个用于相机设备的回调或无法打开的回调。

当相机不再使用时,或者当一个新的可拆卸相机连接起来时,Cameras就会变的可用了。 
当一些应用程序或服务开始使用相机时,或者当一个可移动的相机被断开时,它们就变得不可用了。

扩展这个回调并将子类的实例传递给CameraManager的registerAvailabilityCallback(CameraManager.AvailabilityCallback, Handler) 方法通知这些可用性更改。

回调方法名解释
onCameraAvailable(String cameraId)一个新的相机已经可以使用了。
onCameraUnavailable(String cameraId)以前可用的相机已经不可用了。

<1-2>CameraManager.TorchCallback

CameraManager的内部类TorchCallback回调,官方文档解释: 
一个相机闪光灯torch模式变得可用不可用的回调。

当相机设备所属的相机设备变得不可用或其他相机资源时,由于其他更高的优先级相机活动, torch mode就变得不可用。当它被关闭时,或者当它所属的相机设备不再使用,它所需要的其他相机资源不再忙碌时,torch mode就会不可用。当应用程序调用CameraManager的setTorchMode(String, boolean)关闭相机的torch mode,或者当应用程序打开其他相机的torch mode,,如果同时不支持多个火炬模式,相机的torch mode就会被关闭。当通过setTorchMode(String, boolean)打开torch mode时,torch mode就会可用。

只有当处于禁用或启用状态时,才可以通过setTorchMode(String、boolean)设置torch mode。

扩展这个回调并将一个子类的实例传递给CameraManager的registerTorchCallback(CameraManager.TorchCallback, Handler)将被通知此类状态更改。

回调方法名解释
onTorchModeChanged(String cameraId, boolean enabled)setTorchMode(String, boolean)触发
onTorchModeUnavailable(String cameraId)setTorchMode(String, boolean)触发

<2>CameraDevice

官方文档详解: 
CameraDevice 类是一个连接安卓设备的单一摄像头的代表,可以在高帧率下对图像捕捉和后期处理进行精确控制。

你的应用程序需要在manifest中生命相机权限才可以访问相机设备。

一个给定的相机设备可以提供两个级别的支持:有限的或完全的。如果一个设备只支持有限的级别,那么摄像头会公开一个功能集,它大致相当于旧的摄像头API,不过它的界面更简洁、更高效。如果是全支持,提供了比旧的摄像头API更好的功能。针对有限级别设备的应用程序将在全级设备上保持不变,而如果应用程序需要一个全级别支持的操作,在manifest中声明“android.hardware.camera.level.full”的特征。

该类的常量:

常量名解释
TEMPLATE_MANUAL一个用于直接应用控制捕获参数的基本模板。
TEMPLATE_PREVIEW创建一个适合于相机预览窗口的请求。
TEMPLATE_RECORD创建一个适合于视频录制的请求。
TEMPLATE_STILL_CAPTURE创建一个适合于静态图像捕获的请求。
TEMPLATE_ZERO_SHUTTER_LAG创建一个适用于零快门延迟的请求。
TEMPLATE_VIDEO_SNAPSHOT在录制视频时创建一个适合静态图像捕捉的请求。

该常量一般在CameraDevice的createCaptureRequest(int)方法参数中设置。

该类的方法:

返回值方法名解释
voidclose()尽可能快地关闭与这个相机设备的连接。
CaptureRequest.BuildercreateCaptureRequest(int templateType)创建一个CaptureRequest.Builder用于新捕获请求的,初始化为目标用例的模板。
voidcreateCaptureSession(List Surface outputs, CameraCaptureSession.StateCallback callback, Handler handler)通过向相机设备提供Surfaces的目标输出集,创建一个新的相机捕捉会话。
voidcreateCaptureSessionByOutputConfigurations(List OutputConfiguration outputConfigurations, CameraCaptureSession.StateCallback callback, Handler handler)通过为相机设备提供表面的目标输出集和相应的表面配置来创建一个新的相机捕捉会话。
voidcreateConstrainedHighSpeedCaptureSession(List Surface outputs, CameraCaptureSession.StateCallback callback, Handler handler)创建一个新的受限的高速捕捉会话。
StringgetId()获取相机设备的ID,string类型

CameraDevice还一个方法,就不写在表格中了: 
createReprocessableCaptureSessionByConfigurations(InputConfiguration , outputs, CameraCaptureSession.StateCallback, Handler) ,通过为相机设备提供所需的再处理输入配置和输出输出配置,创建一个新的可重新处理的相机捕捉会话。

<2-1>CameraDevice.StateCallback

CameraDevice的内部类StateCallback,官方文档介绍: 
一个回到对象,用于接收关于相机的更新状态。

一个回调实例必须先实现CameraManager的openCamera(String cameraId, CameraDevice.StateCallback callback, Handler handler) 方法来打开相机设备。

这些状态更新包括关于设备完成启动的通知(允许CameraDevice的createCaptureSession(List, CameraCaptureSession.StateCallback, Handler)被调用),关于设备断开或闭包,以及意外的设备错误。

关于特定的CaptureRequests进程事件是由 CameraCaptureSession.CaptureCallback 提供的,该回调的所有方法见上边表格。 
常量及方法:

返回值常量解释
intERROR_CAMERA_DEVICE由CameraDevice.StateCallback的onError(CameraDevice, int)报告的错误代码,表明相机设备遇到了一个致命错误
intERROR_CAMERA_DISABLED由CameraDevice.StateCallback的onError(CameraDevice, int)报告的错误代码,这表明由于设备的政策,相机设备无法打开。
intERROR_CAMERA_IN_USE由onError(CameraDevice, int)报告的错误代码,表明摄像机设备已经在使用中了
intERROR_CAMERA_SERVICE由onError(CameraDevice, int)报告的错误代码,表明摄像机服务遇到了一个致命错误。
intERROR_MAX_CAMERAS_IN_USE由onError(CameraDevice, int)报告的错误代码,表明相机设备无法打开,因为有太多其他的开放相机设备。
回调方法解释
onClosed(CameraDevice camera)当一个相机设备CameraDevice的close()方法时,这个方法就被调用
onDisconnected(CameraDevice camera)当相机设备不再可用时,这个方法就被调用
onError(CameraDevice camera, int error)当相机设备遇到严重错误时,这种方法就被调用了,错误见上表的常量
onOpened(CameraDevice camera)当相机完成打开操作后,这个方法就被调用

<3>CameraCaptureSession

文档解释: 
CameraDevice类的一个配置捕捉会话,用于捕捉相机的照片,或者用于之前同一个会话中处理相机捕捉的图片。

提供一组目标输出表面给 CameraDevice的createCaptureSession()方法,或者提供一 个InputConfiguration类和为了一个可加工捕捉会话提供一组目标输出表面给CameraDevice的createReprocessableCaptureSession()方法,就会创建CameraCaptureSession对象,一旦创建CameraCaptureSession,这个会话就处于活动状态,除非相机又新建一个会话或者设备关闭。

所有的捕捉会话都可用于从相机捕捉照片,但是只有可加工捕捉会话在之前同一个会话中可以处理从相机捕捉的照片。 
创建一个会话是个昂贵的操作,可以花费零点几秒时间,因为它需要配置摄像机设备的内部管道( pipelines),并分配内存缓冲区,以便将图像发送到所需的目标。因此设置异步操作, CameraDevice的createCaptureSession和createReprocessableCaptureSession方法会将创建出的CameraCaptureSession对象发送给CameraCaptureSession.StateCallback的onConfigured 回调方法,如果配置不能完成,就会回调 onConfigureFailed方法,会话就不能被激活。

如果一个新的会话被相机创建,name之前的会话就会被关闭,他的关联回调CameraCaptureSession.StateCallback的onClosed方法就会被调用,如果会话被关闭,所有会话方法都将抛出IllegalStateException异常。

一个关闭的会话会清除所有重复的操作(就像调用CameraCaptureSession的stopRepeating()方法),但是,在新建的会话接管并配置相机前,仍然像正常一样完成所有的进程捕捉请求。

返回值方法解释
 abortCaptures()丢弃当前正在等待和正在进行中的所有捕获,并尽可能快地完成。
intcapture(CaptureRequest request, CameraCaptureSession.CaptureCallback listener, Handler handler)提交一个图像请求,以便被摄像机设备捕捉到。
intcaptureBurst(List requests, CameraCaptureSession.CaptureCallback listener, Handler handler)提交一列作为突发事件被捕获的请求列表。
 close()异步关闭这个捕获会话。
 finalizeOutputConfigurations(List outputConfigs)最后确定输出配置,这些配置现在包含了它们的延迟和/或额外的表面。
CameraDevicegetDevice()获取这个会话创建的摄像机设备。
SurfacegetInputSurface()获取与可重新处理的捕获会话相关的输入表面。
booleanisReprocessable()如果应用程序可以使用这个摄像机捕捉会话提交可处理的捕获请求,则返回true。
 prepare(Surface surface)预先为输出Surface分配所有缓冲区。
intsetRepeatingBurst(List requests, CameraCaptureSession.CaptureCallback listener, Handler handler)这个捕获会话请求不断地重复捕获一系列图像。
 setRepeatingRequest(CaptureRequest request, CameraCaptureSession.CaptureCallback listener, Handler handler)请求不断地重复捕捉这个捕获会话的图像。
 stopRepeating()取消上边两个方法中任意一个的重复捕捉请求

<3-1>CameraCaptureSession.CaptureCallback

CameraCaptureSession的内部类CaptureCallback,官方文档解释: 
一个回调对象,用于跟踪向相机提交CaptureRequest对象的进程,见下边的CameraDevice.StateCallback的文档解释。

这个回调是在一个请求触发一个捕获开始时调用的,当捕获完成时调用。如果出现错误捕获图像,则会触发错误方法,而不是完成方法。 
重写的七个方法:

方法解释
onCaptureBufferLost(CameraCaptureSession session, CaptureRequest request, Surface target, long frameNumber)如果捕获的单个缓冲区不能发送到它的目标表面,就会调用该方法。
onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result)当一个图像捕捉已经完全完成并且所有的结果元数据都可用时,这个方法就会被调用。
onCaptureFailed(CameraCaptureSession session, CaptureRequest request, CaptureFailure failure)当相机不能向 CaptureResult 对象提供请求,就会调用
onCaptureProgressed(CameraCaptureSession session, CaptureRequest request, CaptureResult partialResult)当图像捕捉取得部分进展时,就会调用该方法;有些(但不是全部)从图像捕获中得到的结果是可用的。
onCaptureSequenceAborted(CameraCaptureSession session, int sequenceId)这个方法独立于CaptureCallback中的其他方法,当捕获序列在任何CaptureResult或capture失败之前通过这个侦听器返回时。
onCaptureSequenceCompleted(CameraCaptureSession session, int sequenceId, long frameNumber)这个方法独立于CaptureCallback中的其他方法,当捕获序列完成后,通过这个侦听器返回所有的CaptureResult或capture失败。
onCaptureStarted(CameraCaptureSession session, CaptureRequest request, long timestamp, long frameNumber)当摄像机设备开始捕捉请求的输出图像,在图像曝光开始时,或者当摄像机设备开始处理一个重新处理请求的输入图像时,这个方法就被调用了。

<3-2>CameraCaptureSession.StateCallback

CameraCaptureSession的内部类StateCallback,一个回调对象,用于接收关于相机捕捉会话状态的更新。 
重写的七个方法:

方法解释
onActive(CameraCaptureSession session)当会话开始主动处理捕获请求时,将调用此方法。
onCaptureQueueEmpty(CameraCaptureSession session)当摄像机设备的输入捕捉队列变为空时,该方法将被调用,并准备接受下一个请求。
onClosed(CameraCaptureSession session)会话关闭触发
onConfigureFailed(CameraCaptureSession session)如果会话不能按照请求配置,则调用此方法。
onConfigured(CameraCaptureSession session)当摄像机设备完成配置时,这个方法就会被调用,会话可以开始处理捕获请求。
onReady(CameraCaptureSession session)每当会话不再需要处理请求时,就会调用此方法。
onSurfacePrepared(CameraCaptureSession session, Surface surface)当输出表的缓冲区预分配完成时,就会调用该方法。

<4>CaptureRequest,CameraCharacteristics,TotalCaptureResult和CaptureResult四个类的区别

这四个类放在一起,是因为他们有共同的字段列表,都继承于CameraMetadata,具体的关系如下: 
1: CaptureRequest extendsCameraMetadata implements Parcelable 
2:CameraCharacteristics extends CameraMetadata 
3:TotalCaptureResult extends CaptureResult CameraMetadata 
4:CameraMetadata比较单一,放在下边一节的表格中显示。

四个类文档解释

<1>CaptureRequest 官方文档解释:

一个不可变的设置和输出,用来从相机设备捕捉单个图像。

包含捕获硬件的配置(传感器sensor,、透镜 lens、闪光灯flash),处理管道pipeline,控制算法和输出缓冲区。还包含目标表面的列表,以便将图像数据发送给该捕获。

使用CaptureRequest.Builder实例创建CaptureRequests对象,通过调用CameraDevice的createCaptureRequest(int templateType) 获取CaptureRequest.Builder对象。 
CaptureRequest对象调用CameraCaptureSession的capture(CaptureRequest, CameraCaptureSession.CaptureCallback, Handler)或者setRepeatingRequest(CaptureRequest, CameraCaptureSession.CaptureCallback, Handler) 方法从相机捕捉照片。

每个请求都可以指定目标表面的不同子集,以便将捕获的数据发送到。当请求被提交到会话时,请求中使用的所有表面都必须是对方法 createCaptureSession(List, CameraCaptureSession.StateCallback, Handler)的最后一次调用所给出的地表列表的一部分( All the surfaces used in a request must be part of the surface list given to the last call to createCaptureSession(List, CameraCaptureSession.StateCallback, Handler), when the request is submitted to the session)

例如,一个用于重复预览的请求可能只包含预览SurfaceView或SurfaceTexture的表面,而高分辨率的静态捕获还包括一个用于高分辨率JPEG图像的ImageReader的表面。

可处理捕获请求允许从摄像机设备获取以前捕获的图像,并将其发送回设备进行进一步处理。 会话用CameraDevice的createReprocessCaptureRequest(TotalCaptureResult)创建,可修理拍照会话用CameraDevice的createReprocessableCaptureSession(InputConfiguration, List, CameraCaptureSession.StateCallback, Handler)创建.

<2>CameraCharacteristics官方文档解释:

描述摄像头设备的属性。

这些属性是给定的摄像头的属性,可以通过CameraManager的getCameraCharacteristics(String cameraId) 方法获取单个摄像头的CameraCharacteristics对象(个人观点:通过该对象可以判断摄像头都支持什么功能,比如闪光灯,方向等等)。

CameraCharacteristics对象是不可变的。 
<3>TotalCaptureResult官方文档解释: 
从图像传感器捕捉到的单个图像捕获的全部结果。

包含捕获硬件的配置(传感器sensor,、透镜 lens、闪光灯flash),处理管道pipeline,控制算法和输出缓冲区。

处理完 CaptureRequest之后,TotalCaptureResult由CameraDevice类产生。所有捕获请求的属性列表都可以在捕获结果中查询到 ,以确定用于捕获的最终的值。结果还包括在捕捉期间相机设备状态的附加元数据。

getAvailableCaptureResultKeys()返回的所有属性是可用的(这是get(CaptureResult.Key)方法将返回非空值,当且仅当启用的关键要求)。除非启用了一个开关(如STATISTICS_FACE_DETECT_MODE),否则在默认情况下,一些关键字将被禁用。请参考每个关键文档的具体情况。

TotalCaptureResult对象是不可变的。

<4>CaptureResult官方文档解释: 
从图像传感器捕获单个图像的结果子集。

包含捕获硬件的配置(传感器sensor,、透镜 lens、闪光灯flash),处理管道pipeline,控制算法和输出缓冲区。

处理完 CaptureRequest之后,CaptureResults由CameraDevice类产生。所有捕获请求的属性列表都可以在捕获结果中查询到,以确定用于捕获的最终的值。结果还包括在捕捉期间相机设备状态的附加元数据。

不是所有属性调用CameraCharacteristics的getAvailableCaptureResultKeys()返回必然是可用的。一些结果是局部的(CaptureResult),并且不会有每一个键集。只有TotalCaptureResult被保证拥有由请求启用的所有可用的键。

CaptureResult对象是不可变的。

四个类各自独有的方法和字段

<1>CaptureRequest

返回值方法解释
intdescribeContents()描述这个可分配实例的集合表示中包含的特殊对象的种类。
booleanequals(Object other)确定这个CaptureRequest是否等于另一个CaptureRequest。
Tget(Key key)获取捕获请求字段值。
ObjectgetTag() 
List>getKeys()返回该map中包含的键列表。
inthashCode() 
booleanisReprocess()确定这是不是一个可加工的捕获请求。
 writeToParcel(Parcel dest, int flags)把这个物体拉到一个包裹里。

CaptureRequest和CaptureResult的父类字段,以及所有各自的字段都是相同的

返回值(public static final )字段名解释
Key BooleanBLACK_LEVEL_LOCK黑等级的补偿是否被锁定在当前的值上,或者是自由的变化。
Key IntegerCOLOR_CORRECTION_ABERRATION_MODE色差
Key RggbChannelVectorCOLOR_CORRECTION_GAINS获得白平衡Bayer的raw color频道
Key IntegerCOLOR_CORRECTION_MODE模式控制选择如何将图像数据从传感器的本机颜色转换为线性sRGB颜色。
Key ColorSpaceTransformCOLOR_CORRECTION_TRANSFORM一种颜色变换矩阵,用于从传感器RGB颜色空间转换为输出线性sRGB色彩空间
Key IntegerCONTROL_AE_ANTIBANDING_MODE相机设备的自动曝光算法的反带补偿的理想设置。
Key IntegerCONTROL_AE_EXPOSURE_COMPENSATION调整自动曝光(AE)目标图像亮度。
Key IntegerCONTROL_AE_LOCK是否自动曝光(AE)目前被锁定在最新的计算值上。
Key IntegerCONTROL_AE_MODE相机设备的自动曝光程序所需的模式。
Key IntegerCONTROL_AE_PRECAPTURE_TRIGGER当它处理这个请求时,摄像机设备是否会触发一个预捕获的测量序列。
Key MeteringRectangle[]CONTROL_AE_REGIONS用于自动曝光调整的计量区域表。
Key BooleanCONTROL_AWB_LOCK自动白平衡(AWB)是否被锁定在最新的计算值上。
Key IntegerCONTROL_AWB_MODE自动白平衡(AWB)是否正在设置颜色转换字段,以及它的照明目标是什么。
Key MeteringRectangle[]CONTROL_AWB_REGIONS用于自动平衡光源估计的计量区域的列表。
Key IntegerCONTROL_CAPTURE_INTENT信息到相机设备3A(自动曝光,自动对焦,自动平衡)例程,以帮助相机设备决定最优的3A策略。
Key IntegerCONTROL_EFFECT_MODE一种特殊的颜色效果。
Key BooleanCONTROL_ENABLE_ZSL允许相机设备为android.control.captureIntent == STILL_CAPTURE 的请求启用零树/延迟模式
Key IntegerCONTROL_MODE3A的整体模式(自动曝光,自动平衡,自动对焦)控制例程。
Key IntegerCONTROL_POST_RAW_SENSITIVITY_BOOST在获取原始传感器数据后,应用于输出图像的额外灵敏度增加。
Key IntegerCONTROL_SCENE_MODE控制哪个场景模式当前是活跃的。
Key IntegerCONTROL_VIDEO_STABILIZATION_MODE视频稳定是否活跃。
Creator CaptureRequestCREATOR 
Key IntegerEDGE_MODE边缘增强的操作模式。
Key IntegerFLASH_MODE闪存模式
Key IntegerHOT_PIXEL_MODE热像素校正的操作模式。
Key LocationJPEG_GPS_LOCATION在生成图像GPS元数据时使用的位置对象。
Key IntegerJPEG_ORIENTATION一个JPEG图像的朝向。
Key ByteJPEG_QUALITY最终JPEG图像的压缩质量
Key SizeJPEG_THUMBNAIL_SIZE嵌入的JPEG缩略图的解析。
Key FloatLENS_APERTURE所需的镜头光圈大小,作为透镜焦距与有效孔径的比值。
Key FloatLENS_FILTER_DENSITY镜头中性密度滤光片(s)所需的设置。
Key FloatLENS_FOCAL_LENGTH想要的镜头焦距;用于光学变焦。
Key FloatLENS_FOCUS_DISTANCE从镜头的最前表面测量到最尖锐焦点的距离。
Key IntegerLENS_OPTICAL_STABILIZATION_MODE设置相机设备在拍摄图像时是否使用光学图像稳定(OIS)。
Key IntegerNOISE_REDUCTION_MODE降噪算法的操作模式。
Key FloatREPROCESS_EFFECTIVE_EXPOSURE_FACTOR在进行再加工前,应用处理的应用程序处理的暴露时间增加了。
Key RectSCALER_CROP_REGION传感器所需要的区域来读取这个捕获(拍某个形状的设置)
Key LongSENSOR_EXPOSURE_TIME持续每一个像素都暴露在光中。
Key LongSENSOR_FRAME_DURATION从帧曝光开始到下一个帧曝光的持续时间。
Key IntegerSENSOR_SENSITIVITY处理前的传感器数据的增益。
Key int[]SENSOR_TEST_PATTERN_DATA当android.sensor.testPatternMode是 SOLID_COLOR,一个pixel[R, G_even, G_odd, B]提供测试模式的像素
Key IntegerSENSOR_TEST_PATTERN_MODE当启用时,传感器会发送一个测试模式,而不是从摄像机中进行真实的曝光。
Key IntegerSHADING_MODE镜头阴影校正的质量应用于图像数据。
Key IntegerSTATISTICS_FACE_DETECT_MODE人脸检测装置的工作模式。
Key BooleanSTATISTICS_HOT_PIXEL_MAP_MODE热像素映射生成的操作模式。
Key IntegerSTATISTICS_LENS_SHADING_MAP_MODE摄像机设备是否会输出结果元数据中的镜头着色图。
Key TonemapCurveTONEMAP_CURVE当android.tonemap.mode 是CONTRAST_CURVE时,使用音调/对比度/伽玛曲线
Key FloatONEMAP_GAMMAandroid.tonemap.mode 是GAMMA_VALUE时,使用Tonemapping曲线。tonemap曲线将定义如下公式:OUT=pow(在1.0/gamma中)输入的像素值被缩放到范围0.0,1.0,pow是能量函数,而伽玛是这个键所指定的伽马值。
Key IntegerTONEMAP_MODE高级全球对比/γ/ tonemapping控制。
Key IntegerTONEMAP_PRESET_CURVEandroid.tonemap.mode 是 PRESET_CURVE时,使用Tonemapping曲线。tonemap曲线将由指定的标准定义。

<1-1>CaptureRequest.Builder

CaptureRequest内部类Builder,捕获请求的构建器。要获得构建器实例,可以使用CameraDeviced的createCaptureRequest(int)方法,该方法将请求字段初始化为在CameraDevice定义的一个模板。

返回值(public static final )方法名解释
 addTarget(Surface outputTarget)向该请求的目标列表添加一个表面。当请求被发送给摄像机设备时,添加的表面必须是最近调用createCaptureSession(List, CameraCaptureSession.StateCallback, Handler)方法的一个表面。
CaptureRequestbuild()使用当前目标表面和设置构建一个请求。
Tget(Key key)获取抓捕请求字段值
 removeTarget(Surface outputTarget)从这个请求的目标列表中删除一个表面。
 set(Key key, T value)将捕获请求字段设置为一个值
 setTag(Object tag)为这个请求设置一个标记。

常用的方法已加粗,通过CaptureRequest.Builder的set(Key key, T value)方法设置各种参数,比如自动对焦,设置flash,key值就是上面表中CaptureRequest的字段表,再通过build()方法生成CaptureRequest对象。注意,CaptureRequest继承于CameraMetadata类,CameraMetadata类的字段才是相机属性值的基类。

<2>CameraCharacteristics

返回值方法解释
Tget(Key key)获取捕获请求字段值。
List KeygetAvailableCaptureRequestKeys()获取CaptureRequest设置给CameraDevice的键值集合
List KeygetAvailableCaptureResultKeys()获取CaptureResult设置给CameraDevice的键值集合
List KeygetKeys()获取map中的键值集合
返回值(public static final )字段名解释
Key int[]COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES异常校正模式
Key int[]CONTROL_AE_AVAILABLE_ANTIBANDING_MODES自动曝光反带模式列表
Key int[]CONTROL_AE_AVAILABLE_MODES在自动曝光模式列表
Key RangeCONTROL_AE_AVAILABLE_TARGET_FPS_RANGES帧速率范围表
Key RationalCONTROL_AE_COMPENSATION_STEP最小的一步,可以改变曝光补偿。
Key int[]CONTROL_AF_AVAILABLE_MODES自动对焦(AF)列表
Key int[]CONTROL_AVAILABLE_EFFECTS色彩效果列表
Key int[]CONTROL_AVAILABLE_MODES控制模式列表
Key int[]CONTROL_AVAILABLE_SCENE_MODES场景列表模式
Key int[]CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES视频稳定模式列表
Key int[]CONTROL_AWB_AVAILABLE_MODES白平衡模式列表
Key BooleanCONTROL_AWB_LOCK_AVAILABLE相机设备支持MANUAL_POST_PROCESSING或BURST_CAPTURE则为true
Key IntegerCONTROL_MAX_REGIONS_AE自动曝光(AE)例程可使用的最大计量区域数。
Key IntegerCONTROL_MAX_REGIONS_AF自动对焦(AF)例程可使用的最大计量区域数。
Key IntegerCONTROL_MAX_REGIONS_AWB自动白平衡(AWB)例程可使用的最大计量区域数。
Key RangeCONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE范围的增加
Key BooleanDEPTH_DEPTH_IS_EXCLUSIVE表示捕获请求是否可以同时针对DEPTH16/depthpointcloud输出,以及正常的颜色输出(例如yuv420888、JPEG或RAW)。
Key int[]EDGE_AVAILABLE_EDGE_MODES边缘增强模式列表
Key BooleanFLASH_INFO_AVAILABLE相机是否有闪光灯单元
Key int[]HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES热像素校正模式列表
Key IntegerINFO_SUPPORTED_HARDWARE_LEVEL通常将相机设备功能的整体分类。
Key Size[]JPEG_AVAILABLE_THUMBNAIL_SIZESJPEG缩略图的列表
Key IntegerLENS_FACING摄像机相对于设备屏幕的方向
Key float[]LENS_INFO_AVAILABLE_APERTURES孔径尺寸值表
Key float[]LENS_INFO_AVAILABLE_FILTER_DENSITIES中性密度滤波器值表
Key float[]LENS_INFO_AVAILABLE_FOCAL_LENGTHS焦距列表
Key int[]LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION光学图像稳定(OIS)模式列表
Key IntegerLENS_INFO_FOCUS_DISTANCE_CALIBRATION镜头聚焦距离校准质量。
Key FloatLENS_INFO_HYPERFOCAL_DISTANCE这个镜头的超焦距。
Key FloatLENS_INFO_MINIMUM_FOCUS_DISTANCE在镜头前的最短距离,可以把焦点集中在镜头的最前面。
Key float[]LENS_INTRINSIC_CALIBRATION该相机设备的固有校正参数。
Key float[]LENS_POSE_ROTATION传感器坐标系统的方向。
Key float[]LENS_POSE_TRANSLATION照相机光学中心的位置。
Key float[]LENS_RADIAL_DISTORTION修正了该相机装置的径向和切向透镜畸变的校正系数。
Key int[]NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES噪声抑制方式表
Key IntegerREPROCESS_MAX_CAPTURE_STALL通过重新处理捕获请求引入的最大摄相机捕获管道(在帧数单元中)。
Key int[]REQUEST_AVAILABLE_CAPABILITIES这个相机设备所宣传的功能是完全支持的。
Key IntegerREQUEST_MAX_NUM_INPUT_STREAMS任何类型的输入流的最大数量,可以同时被摄像机设备配置和使用。
Key IntegerREQUEST_MAX_NUM_OUTPUT_PROC不同类型的输出流的最大数量,可以同时配置和使用一个摄像机设备来处理任何处理的(但不是停滞的)格式。
Key IntegerREQUEST_MAX_NUM_OUTPUT_PROC_STALLING可以对任意处理(和停止)格式的摄像机设备同时配置和使用的不同类型的输出流的最大数量。
Key IntegerREQUEST_MAX_NUM_OUTPUT_RAW不同类型的输出流的最大数量,可以同时配置和使用任何原始格式的摄像机设备。
Key IntegerREQUEST_PARTIAL_RESULT_COUNT定义一个结果将由多少子组件组成。
Key ByteREQUEST_PIPELINE_MAX_DEPTH指定一个框架必须经历的最大管道阶段的数量,当它暴露在框架下的时候。
Key FloatSCALER_AVAILABLE_MAX_DIGITAL_ZOOM活动区域宽度和作物区域宽度、活动区高度和作物区高度之间的最大比率,
Key IntegerSCALER_CROPPING_TYPE这个相机设备所支持的裁剪类型。
Key StreamConfigurationMapSCALER_STREAM_CONFIGURATION_MAP这个相机设备支持的可用的流配置;还包括最小帧持续时间和每个格式/大小组合的停顿时间。
Key int[]SENSOR_AVAILABLE_TEST_PATTERN_MODES传感器测试模式模式列表
Key BlackLevelPatternSENSOR_BLACK_LEVEL_PATTERN每一种颜色过滤装置(CFA)马赛克通道都有固定的黑色电平。
Key ColorSpaceTransformSENSOR_CALIBRATION_TRANSFORM1每个设备的校准转换矩阵,从参考传感器的色彩空间映射到实际的设备传感器的色彩空间。
Key ColorSpaceTransformSENSOR_CALIBRATION_TRANSFORM2每个设备的校准转换矩阵,从参考传感器的色彩空间映射到实际的设备传感器的色彩空间(这是原始缓冲区数据的色彩空间)。
Key ColorSpaceTransformSENSOR_COLOR_TRANSFORM1一个矩阵,它将颜色值从CIE XYZ颜色空间转换为参考传感器颜色空间。
Key ColorSpaceTransformSENSOR_COLOR_TRANSFORM2一个矩阵,它将颜色值从CIE XYZ颜色空间转换为参考传感器颜色空间。
Key ColorSpaceTransformSENSOR_FORWARD_MATRIX1一个矩阵,它将白色平衡摄像机的颜色从参考传感器的色彩空间转换为带有D50白色点的CIE XYZ颜色空间。
Key ColorSpaceTransformSENSOR_FORWARD_MATRIX2一个矩阵,它将白色平衡摄像机的颜色从参考传感器的色彩空间转换为带有D50白色点的CIE XYZ颜色空间。
Key SizeSENSOR_INFO_PIXEL_ARRAY_SIZE全像素数组的尺寸,可能包括黑色校准像素
Key RectSENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE在应用任何几何畸变校正之前,图像传感器的区域与活动的像素相对应。
Key RangeSENSOR_INFO_SENSITIVITY_RANGE敏感的范围
Key IntegerSENSOR_INFO_TIMESTAMP_SOURCE传感器捕获的时间基准源开始时间戳。
Key IntegerSENSOR_INFO_WHITE_LEVEL传感器的最大原始值输出。
Key IntegerSENSOR_MAX_ANALOG_SENSITIVITY最大灵敏度是通过模拟增益实现的。
Key IntegerSENSOR_OPTICAL_BLACK_REGIONS显示传感器光学屏蔽黑色像素区域的分离矩形的列表。
Key Rect[]SENSOR_OPTICAL_BLACK_REGIONS显示传感器光学屏蔽黑色像素区域的分离矩形的列表。
Key IntegerSENSOR_ORIENTATION顺时针方向的角度,在设备屏幕上,输出图像需要旋转以保持在本机定位上。
Key IntegerSENSOR_REFERENCE_ILLUMINANT1标准参考光源用作场景光源
Key ByteSENSOR_REFERENCE_ILLUMINANT2 
Key int[]SHADING_AVAILABLE_MODES透镜阴影模式列表
Key int[]STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES人脸检测方式
Key boolean[]STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES热像素映射输出模式列表
Key int[]STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES镜头阴影贴图输出模式列表
Key IntegerSTATISTICS_INFO_MAX_FACE_COUNT同时可检测到的人脸的最大数量。
Key IntegerSYNC_MAX_LATENCY提交请求后(不同于之前的)的最大帧数被提交,并且在结果的状态变为同步之前。
Key int[]TONEMAP_AVAILABLE_TONE_MAP_MODEStonemapping列表模式
Key IntegerTONEMAP_MAX_CURVE_POINTS 

<3>TotalCaptureResult

返回值方法解释
List CaptureResultgetPartialResults()获得组成这个总结果的部分结果的只读列表。

<4>CaptureResult

CaptureResult的所有字段和CaptureRequest相同,请参考上边列表即可,下表是暴露的方法:

返回值方法解释
Tget(Key key)获取捕获请求字段值。
longgetFrameNumber()得到与这个结果相关联的帧数。
List KeygetKeys()返回该map中包含的键列表。
CaptureRequestgetRequest()获取与此结果相关联的请求。
intgetSequenceId()CameraCaptureSession的capture(CaptureRequest,CameraCaptureSession.CaptureCallback, Handler)家庭的功能返回失败的序列ID

<5>基类CameraMetadata

摄像机控制和信息的基类。 
这个类定义了用于查询相机特性或捕获结果的基本键/值映射,以及设置相机请求参数。 
照相机的所有实例都是不可变的。getKeys()的键列表永远不会改变,也不会在对象的生命周期中返回任何键返回的值。

如下字段当做手册查询即可:

字段名(int )解释
COLOR_CORRECTION_ABERRATION_MODE_FAST异常校正不会降低相对于传感器原始输出的捕获率。
COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY异常校正在提高质量上运行,但捕获率可能降低(相对于传感器的原始输出率)。
COLOR_CORRECTION_ABERRATION_MODE_OFF不进行异常校正。
COLOR_CORRECTION_MODE_FAST颜色校正处理不能降低相对于传感器原始输出的捕获率。
COLOR_CORRECTION_MODE_HIGH_QUALITY在指定的白色平衡管道上方或以上的高级白色平衡调整可能被应用。
COLOR_CORRECTION_MODE_TRANSFORM_MATRIX使用android.colorCorrection.transform 矩阵 和android.colorCorrection.gains来做颜色转换
CONTROL_AE_ANTIBANDING_MODE_50HZ这款相机将调整曝光时间,以避免使用50Hz的照明电源。
CONTROL_AE_ANTIBANDING_MODE_60HZ这款相机将调整曝光时间,以避免使用60Hz的照明电源。
CONTROL_AE_ANTIBANDING_MODE_AUTO自适应照明条件
CONTROL_AE_ANTIBANDING_MODE_OFF相机设备不会调整曝光时间以避免出现问题。
CONTROL_AE_MODE_OFF相机设备的自动曝光程序被禁用。
CONTROL_AE_MODE_ON相机设备的自动曝光程序是主动的,没有闪光控制。
CONTROL_AE_MODE_ON_ALWAYS_FLASH闪光灯一直打开
CONTROL_AE_MODE_ON_AUTO_FLASH自适应,在光线较弱的情况下发射
CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE自适应,但自动红眼减少
CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL相机设备将取消当前的任何活动或已完成的预捕捉测量序列,自动曝光程序将返回其初始状态
CONTROL_AE_PRECAPTURE_TRIGGER_IDLE触发器是空闲的。
CONTROL_AE_PRECAPTURE_TRIGGER_START预捕获的测量序列将由摄像机设备启动。
CONTROL_AE_STATE_CONVERGEDAE对当前场景有很好的控制值。
CONTROL_AE_STATE_FLASH_REQUIREDAE有一组很好的控制值,但是flash需要被触发,因为它的质量仍然很好。
CONTROL_AE_STATE_INACTIVEAE关闭或最近重置。
CONTROL_AE_STATE_LOCKEDAE被锁定
CONTROL_AE_STATE_PRECAPTUREAE被要求做一个预捕获序列,目前正在执行它。
CONTROL_AE_STATE_SEARCHINGAE在当前场景中还没有一组良好的控制值。
CONTROL_AF_MODE_AUTO基本的自动对焦模式。
CONTROL_AF_MODE_CONTINUOUS_PICTURE在这种模式下,AF算法不断地修改镜头位置,试图提供一个恒定不变的图像流。
CONTROL_AF_MODE_CONTINUOUS_VIDEO在这种模式下,AF算法不断地修改镜头位置,试图提供一个恒定不变的视频流。
CONTROL_AF_MODE_EDOF扩展的景深(数字焦点)模式。
CONTROL_AF_MODE_MACRO特写镜头聚焦模式。
CONTROL_AF_MODE_OFF自动对焦程序无法控制镜头,android.lens.focusDistance 由应用程序控制
CONTROL_AF_STATE_ACTIVE_SCANAF正在执行一个AF扫描,因为它是由AF触发器触发的。
CONTROL_AF_STATE_FOCUSED_LOCKEDAF相信它是正确的并且锁定了焦点。
CONTROL_AF_STATE_INACTIVEAF已经关闭,或者还没有被要求扫描。
CONTROL_AF_STATE_NOT_FOCUSED_LOCKEDAF未能成功地集中注意力,并且锁定了焦点。
CONTROL_AF_STATE_PASSIVE_FOCUSEDAF目前认为它是焦点,但可能在任何时候重新启动扫描。
CONTROL_AF_STATE_PASSIVE_SCANAF目前正在进行一种自动对焦模式的自动对焦,这是一种持续的自动对焦模式。
CONTROL_AF_STATE_PASSIVE_UNFOCUSEDAF在没有找到焦点的情况下完成了被动扫描,并且可以在任何时候重新启动扫描。
CONTROL_AF_TRIGGER_CANCEL自动对焦将返回到初始状态,并取消任何当前的活动触发器。
CONTROL_AF_TRIGGER_IDLE触发器是空闲的。
CONTROL_AF_TRIGGER_START自动对焦现在将触发。
CONTROL_AWB_MODE_AUTO自动白平衡程序是主动的
CONTROL_AWB_MODE_CLOUDY_DAYLIGHT相机装置使用浑浊的日光作为白色平衡的假设场景照明
CONTROL_AWB_MODE_DAYLIGHT相机装置使用日光照明作为白色平衡的假设场景照明。
CONTROL_AWB_MODE_FLUORESCENT相机装置使用荧光灯作为白色平衡的假设场景照明。
CONTROL_AWB_MODE_INCANDESCENT相机装置使用白炽灯作为白色平衡的假设场景照明。
CONTROL_AWB_MODE_OFF相机装置的自动白平衡程序被禁用。
CONTROL_AWB_MODE_SHADE相机装置使用遮光灯作为白色平衡的假设场景照明。
CONTROL_AWB_MODE_TWILIGHT相机装置使用微光作为白色平衡的假设场景照明。
CONTROL_AWB_MODE_WARM_FLUORESCENT相机装置使用温暖的荧光灯作为白色平衡的假设场景照明。
CONTROL_AWB_STATE_CONVERGEDAWB(自动白平衡)对当前场景有一组很好的控制值。
CONTROL_AWB_STATE_INACTIVEAWB不是自动模式,或者还没有开始测量。
CONTROL_AWB_STATE_LOCKEDAWB被锁定
CONTROL_AWB_STATE_SEARCHINGAWB在当前场景中还没有很好的控制值。
CONTROL_CAPTURE_INTENT_CUSTOM这个请求的目标不属于其他类别。
CONTROL_CAPTURE_INTENT_MANUAL此请求用于手动捕获用例,其中应用程序希望直接控制捕获参数。
CONTROL_CAPTURE_INTENT_PREVIEW这个请求是一个类似于预览的用例。
CONTROL_CAPTURE_INTENT_STILL_CAPTURE这个请求是针对一个静态捕获类型的用例。
CONTROL_CAPTURE_INTENT_VIDEO_RECORD这个请求是一个视频记录用例。
CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT这个请求是用于一个视频快照(在录制视频时仍然是图像)用例。
CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG此请求适用于ZSL usecase;该应用程序将会流全解析度的图像,然后再处理一个或几个,最后捕获。
CONTROL_EFFECT_MODE_AQUA一种“aqua”效应,将蓝色的色调添加到图像中。
CONTROL_EFFECT_MODE_BLACKBOARD一种“黑板”效应,图像通常显示为黑色区域,有白色或灰色的细节。
CONTROL_EFFECT_MODE_MONO一种“单色”效果,将图像映射成单一颜色。
CONTROL_EFFECT_MODE_NEGATIVE图像的颜色颠倒的“光负”效应。
CONTROL_EFFECT_MODE_OFF不会使用彩色效果。
CONTROL_EFFECT_MODE_POSTERIZE一种“色调分离”的效果,即图像使用音调的离散区域而不是连续的音调梯度。
CONTROL_EFFECT_MODE_SEPIA一种“深褐色”效应,图像被映射成温暖的灰色、红色和棕色的色调。
CONTROL_EFFECT_MODE_SOLARIZE一种“太阳化”效果(Sabattier effect),在这里,图像完全或部分地颠倒了。
CONTROL_EFFECT_MODE_WHITEBOARD一个“白板”效果,图像通常显示为白色区域,有黑色或灰色的细节。
CONTROL_MODE_AUTO每个3A例程使用设置。
CONTROL_MODE_OFF管道的完全应用控制。
CONTROL_MODE_OFF_KEEP_STATE与OFF模式相同,除了这个捕捉不会被摄像机设备背景自动曝光,自动白平衡和自动对焦算法(3A)更新他们的统计数据。
CONTROL_MODE_USE_SCENE_MODE使用特定的场景模式。
CONTROL_SCENE_MODE_ACTION对快速移动对象的照片进行优化。
CONTROL_SCENE_MODE_BARCODE为精确捕捉条形码的照片而进行优化,以供希望读取条形码值的相机应用程序使用。
CONTROL_SCENE_MODE_BEACH为明亮的户外海滩设置优化。
CONTROL_SCENE_MODE_CANDLELIGHT在主要光源为火焰的昏暗环境中进行优化。
CONTROL_SCENE_MODE_DISABLED指示没有为给定的捕获请求设置场景模式。
CONTROL_SCENE_MODE_FACE_PRIORITY如果存在面部检测支持,使用面部检测数据自动对焦、自动白平衡和自动曝光程序。
CONTROL_SCENE_MODE_FIREWORKS优化了晚上的焰火照片。
CONTROL_SCENE_MODE_HDR打开设备特定的高动态范围(HDR)模式。
CONTROL_SCENE_MODE_LANDSCAPE对远处宏观物体的照片进行优化。
CONTROL_SCENE_MODE_NIGHT优化低光线设置。
CONTROL_SCENE_MODE_NIGHT_PORTRAIT对低光环境下的人的静态照片进行优化。
CONTROL_SCENE_MODE_PARTY为昏暗,室内设置和多个移动的人优化。
CONTROL_SCENE_MODE_PORTRAIT优化了人们的静态照片。
CONTROL_SCENE_MODE_SNOW为明亮的,室外设置的雪优化
CONTROL_SCENE_MODE_SPORTS对快速移动的人的照片进行优化。
CONTROL_SCENE_MODE_STEADYPHOTO由于设备运动的量小而优化避免了模糊的照片(例如:由于握手)。
CONTROL_SCENE_MODE_SUNSET对落日场景进行了优化。
CONTROL_SCENE_MODE_THEATRE对昏暗的室内设置进行优化,闪光灯必须保持关闭状态。
CONTROL_VIDEO_STABILIZATION_MODE_OFF视频稳定是禁用的。
CONTROL_VIDEO_STABILIZATION_MODE_ON启用视频稳定。
EDGE_MODE_FAST在质量水平上应用边缘增强,它不会减慢帧率相对于传感器输出。
EDGE_MODE_HIGH_QUALITY应用高质量的边缘增强,以降低输出帧率的代价。
EDGE_MODE_OFF没有使用边缘增强。
EDGE_MODE_ZERO_SHUTTER_LAG基于分辨率的不同输出流,边缘增强应用于不同的层次。
FLASH_MODE_OFF不适用闪光灯
FLASH_MODE_SINGLE如果闪光灯是可用的,并且被充电,那就用闪光灯来捕捉。
FLASH_MODE_TORCH闪光持续不断。
FLASH_STATE_CHARGING闪光灯在充电,不能使用
FLASH_STATE_FIRED这次抓拍使用闪光
FLASH_STATE_PARTIAL闪光部分照亮了这帧。
FLASH_STATE_READYFlash已经准备好使用了。
FLASH_STATE_UNAVAILABLE相机不支持闪光灯
HOT_PIXEL_MODE_FAST采用热像素校正,不降低帧率,相对于传感器的原始输出。
HOT_PIXEL_MODE_HIGH_QUALITY采用高质量的热像素校正,相对于传感器的原始输出,其帧速率可能会降低。
HOT_PIXEL_MODE_OFF没有使用热像素校正。
INFO_SUPPORTED_HARDWARE_LEVEL_3这款相机的设备可以进行YUV的再处理和原始数据采集,同时具备全层功能。
INFO_SUPPORTED_HARDWARE_LEVEL_FULL该相机装置能够支持先进的成像应用。
INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY这个相机设备运行在向后兼容模式。
INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED这个相机设备没有足够的能力来满足成为一个完整的设备或更好。
LENS_FACING_BACK后置摄像头。
LENS_FACING_EXTERNAL外部摄像头,没有固定的相对于设备的屏幕
LENS_FACING_FRONT**前置摄像头
LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE镜头焦距以屈光度测量。
LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED用屈光度测量了透镜的焦距,并进行了校正。
LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED镜头焦距不准确,用于android.lens.focusDistance的单元不对应于任何物理单元
LENS_OPTICAL_STABILIZATION_MODE_OFF光学稳定不可用。
LENS_OPTICAL_STABILIZATION_MODE_ON光学稳定可用。
LENS_STATE_MOVING一个或几个镜头参数(android.lens.focalLength, android.lens.focusDistance, android.lens.filterDensity or android.lens.aperture)正在改变
LENS_STATE_STATIONARY一个或几个镜头参数(android.lens.focalLength, android.lens.focusDistance, android.lens.filterDensity and android.lens.aperture) 没有改变
NOISE_REDUCTION_MODE_FAST在不降低相对于传感器输出的帧率的情况下应用降噪。
NOISE_REDUCTION_MODE_HIGH_QUALITY采用高质量的降噪方法,降低了相对于传感器输出的帧率。
NOISE_REDUCTION_MODE_MINIMAL在不降低传感器输出的帧率的情况下,应用最小的降噪方法。
NOISE_REDUCTION_MODE_OFF不应用降噪。
NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG根据分辨率,不同的输出流采用不同的降噪方法。
REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE最小功能集,每个相机设备(无论android.info.supportedHardwareLevel)支持。
REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE相机设备支持在> = 20帧每秒捕获高分辨率图像,至少在未压缩的YUV格式下,当处理后设置快速设置时。
REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO该设备支持受约束的高速视频记录(帧速率> = 120fps)用例。
REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT摄像机装置可以从它的视野中产生深度测量。
REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING后处理阶段的摄像装置可以手动控制。
REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR相机设备可以手动控制(比如自动曝光,自动对焦等3A算法)。
REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING相机设备支持零快门延迟后处理用例。
REQUEST_AVAILABLE_CAPABILITIES_RAW摄像机设备支持输出原始缓冲区和元数据来解释它们。
REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS当内置的3A算法在运行时,相机设备支持精确地报告传感器的设置。
REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING,即摄像头设备支持YUV_420_888后处理用例,类似于PRIVATE_REPROCESSING,该功能要求摄像头设备支持以下内容:支持一个输入流,即android.request。maxNumInputStreams = = 1
SCALER_CROPPING_TYPE_CENTER_ONLY相机装置只支持中心的作物区域。
SCALER_CROPPING_TYPE_FREEFORM相机装置支持任意选择的作物区域。
SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_BGGR 
SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GBRG 
SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GBRG 
SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GBRG传感器不是拜耳;输出的每个像素值为3个16位值,而不是每个像素只有1个16位的值。
SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGGB 
SENSOR_INFO_TIMESTAMP_SOURCE_REALTIMEandroid.sensor.timestamp和elapsedRealtimeNanos()时间戳相同,它们可以与使用该基础的其他时间戳进行比较。
SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWNandroid.sensor.timestamp的时间戳以纳秒和单调为单位,但不能与其他子系统的时间戳进行比较
SENSOR_REFERENCE_ILLUMINANT1_CLOUDY_WEATHER 
SENSOR_REFERENCE_ILLUMINANT1_COOL_WHITE_FLUORESCENTW 3900 - 4500K
SENSOR_REFERENCE_ILLUMINANT1_D50 
SENSOR_REFERENCE_ILLUMINANT1_D55 
SENSOR_REFERENCE_ILLUMINANT1_D65 
SENSOR_REFERENCE_ILLUMINANT1_D75 
SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT 
SENSOR_REFERENCE_ILLUMINANT1_FINE_WEATHER 
SENSOR_REFERENCE_ILLUMINANT1_FLASH 
SENSOR_REFERENCE_ILLUMINANT1_FLUORESCENT 
SENSOR_REFERENCE_ILLUMINANT1_ISO_STUDIO_TUNGSTEN 
SENSOR_REFERENCE_ILLUMINANT1_ISO_STUDIO_TUNGSTEN 
SENSOR_REFERENCE_ILLUMINANT1_STANDARD_A 
SENSOR_REFERENCE_ILLUMINANT1_STANDARD_B 
SENSOR_REFERENCE_ILLUMINANT1_STANDARD_C 
SENSOR_REFERENCE_ILLUMINANT1_TUNGSTEN白炽灯
SENSOR_REFERENCE_ILLUMINANT1_WHITE_FLUORESCENTD 5700 - 7100K
SENSOR_REFERENCE_ILLUMINANT1_DAY_WHITE_FLUORESCENTN 4600 - 5400K
SENSOR_REFERENCE_ILLUMINANT1_WHITE_FLUORESCENTWW 3200 - 3700K
ENSOR_TEST_PATTERN_MODE_COLOR_BARS所有的像素数据被一个8小节的颜色模式取代。
SENSOR_TEST_PATTERN_MODE_COLOR_BARS_FADE_TO_GRAY测试模式与COLOR_BARS类似,只是每个条都应该从顶部的指定颜色开始,并在底部渐变为灰色。
SENSOR_TEST_PATTERN_MODE_CUSTOM1第一个自定义测试模式。
SENSOR_TEST_PATTERN_MODE_OFF没有使用测试模式模式,相机设备返回从图像传感器捕获。
SENSOR_TEST_PATTERN_MODE_PN9所有像素数据都由pn9512位序列生成的伪随机序列(通常在带有线性反馈移位寄存器的硬件中实现)所替代。
SENSOR_TEST_PATTERN_MODE_SOLID_COLORSENSOR_TEST_PATTERN_MODE_SOLID_COLOR提供的每个像素的[R, G_even, G_odd, B]被其各自的颜色通道所取代
SHADING_MODE_FAST应用镜头遮阳校正,不减慢帧率相对于传感器的原始输出
SHADING_MODE_HIGH_QUALITY采用高质量的镜片阴影校正,以降低帧率为代价。
SHADING_MODE_OFF不使用镜片阴影校正。
STATISTICS_FACE_DETECT_MODE_FULL返回所有元数据。
STATISTICS_FACE_DETECT_MODE_OFF在捕获结果中不包括人脸检测统计。
STATISTICS_FACE_DETECT_MODE_SIMPLE只返回矩形和置信值。
STATISTICS_LENS_SHADING_MAP_MODE_OFF在捕获结果中不包括镜头阴影图。
STATISTICS_LENS_SHADING_MAP_MODE_ON在捕获结果中包括一个镜头阴影图
STATISTICS_SCENE_FLICKER_50HZ相机设备在当前场景中检测到50Hz的照明。
STATISTICS_SCENE_FLICKER_60HZ 
STATISTICS_SCENE_FLICKER_NONE摄像机设备没有检测到当前场景中任何闪烁的照明
SYNC_MAX_LATENCY_PER_FRAME_CONTROL每一帧都有立即应用的请求。
SYNC_MAX_LATENCY_UNKNOWN每一新帧都有一些过去请求应用到相机设置的子集(可能是整个集合)。
TONEMAP_MODE_CONTRAST_CURVE 
TONEMAP_MODE_FAST在不降低帧速率的情况下,可以应用高级的伽马映射和颜色增强。
TONEMAP_MODE_GAMMA_VALUE使用android.tonemap中指定的伽玛值
使用android.tonemap中指定的伽玛值高质量的伽马映射和彩色增强将会被应用,与原始传感器输出相比,可能会降低帧速率。
TONEMAP_MODE_PRESET_CURVE使用android.tonemap中指定的预设置的tonemapping曲线
TONEMAP_PRESET_CURVE_REC709onemapping曲线由itu - r bt709定义
TONEMAP_PRESET_CURVE_SRGB调色曲线是由sRGB定义的

<6>照片数据处理类ImageReader

ImageReader extends Object 
官方文档解释: 
ImageReader类允许应用程序直接将图片数据渲染到Surface上 
一些Android media API类允许将Surface类当做渲染目标,包括 MediaPlayer, MediaCodec, CameraDevice, ImageWriter 和Allocations. 每个源可以使用的图像大小和格式各不相同,并且应该在特定API的文档中进行检查。 
图像数据被封装到Image对象中,同时也可以被多个这种对象访问。通过它的Surface类,新的Image数据将ImageReader类发送到队列,调用 ImageReader的acquireLatestImage() 或者oacquireNextImage() 方法接收Image数据。由于内存限制,如果ImageReader不能以与生产速率相同的速率获取和释放图像,那么图像源将最终停止或删除图像。 
暴露的方法见下表:

返回值方法解释
ImageacquireLatestImage()从ImageReader的队列中获取最新的图像,删除较旧的Image
ImageacquireNextImage()从ImageReader队列获取下一个图像
 close()释放与此ImageReader相关的所有资源。
intgetHeight()图像的默认高度,以像素为单位
intgetImageFormat()图像的默认图像格式。
intgetMaxImages()从ImageReader获得的最大数量的图像
SurfacegetSurface()获得一个可以用来为这个ImageReader生成图像的Surface
intgetWidth()图像的默认宽度,以像素为单位
ImageReadernewInstance(int width, int height, int format, int maxImages)为想要的大小和格式创建一个新的对象
 setOnImageAvailableListener(ImageReader.OnImageAvailableListener listener, Handler handler)当一个新映像从ImageReader可用时,注册一个侦听器将被调用。

该表的setOnImageAvailableListener的第一个参数,就可以将获取的数据在任意地方实现,以便保存拍照的数据

<6>xml布局类TextureView

官方文档解释: 
TextureView类可以展示内容流,这样的内容流可以是一个video或者一个OpenGL场景,内容流可以来自应用程序的流程和远程流程。

TextureView 只可以用于硬件加速窗口,当它在软件中渲染时,TextureView不画任何内容。 
和SurfaceView不同,TextureView没有创建一个分离的窗口,它的行为是一个正常的视图。关键的区别是TextureView可以移动,转换,动画等。例如,你可以调用mView.setAlpha(0.5)方法让TextureView变成半透明。 
使用 TextureView很简单,你只需要获取它的SurfaceTextrue,这个SurfaceTexture可用来渲染内容,SurfaceTexture对象可以通过getSurfaceTexture()方法或者TextureView.SurfaceTextureListener监听获得。重要的是要知道,只有TextureView在连接到窗口后,才可以使用SurfaceView(并且已经调用了TextureView的onAttachedToWindow()方法)。强烈建议使用监听器方式,以便在SurfaceTexture变成可用时,通知到监听中做处理。 
需要注意的是,只有一个生产者可以使用TextureView,例如,如果你用TextureView展示相机预览,你就不能同时使用 lockCanvas()在TextureView上绘制。

返回值方法解释
voidbuildLayer()调用这种方法没有效果。
final voiddraw(Canvas canvas)textureView的子类不能使用Canvas对象进行自己的渲染。
BitmapgetBitmap(int width, int height)返回SurfaceTexture相关内容的Bitmap对象
BitmapgetBitmap() 
BitmapgetBitmap(Bitmap bitmap)将该视图的SurfaceTexture的内容复制到指定的bitmap中。
intgetLayerType()返回LAYER_TYPE_HARDWARE.
SurfaceTexturegetSurfaceTexture()获取视图的SurfaceTexture 对象
SurfaceTextureListenergetSurfaceTextureListener() 
MatrixgetTransform(Matrix transform)返回与此纹理视图关联的转换。
booleanisAvailable()如果与TextureView相关的 SurfaceTexture 可以用于呈现,则返回true
booleanisOpaque()表示此视图是否不透明
CanvaslockCanvas()开始编辑表面的像素。
CanvaslockCanvas(Rect dirty)就像lockCanvas(),但是允许指定一个脏的矩形。
voidsetForeground(Drawable foreground)提供一个可以在视图中所有内容之上呈现的可绘制的图。
voidsetLayerPaint(Paint paint)更新当前layout中使用的paint对象(仅在当前层类型没有设置为LAYER_TYPE_NONE才可以使用)
voidsetOpaque(boolean opaque)表示此文本检查的内容是否不透明。
voidsetLayerType(int layerType, Paint paint)当TextureView总被当做硬件层,这个层类型就会被忽略
 setSurfaceTexture(SurfaceTexture surfaceTexture)为视图添加SurfaceTexture使用(自定义使用)
 setSurfaceTextureListener(SurfaceTextureListener listener)监听TextureView事件
 setTransform(Matrix transform)设置和TextureView相关的转换
 unlockCanvasAndPost(Canvas canvas)结束像素编辑

Camera2的使用简单说就是,xml布局使用TextureView,操作流程都在android.hardware.camera2中,拍照结果用ImageReader处理。而具体的android.hardware.camera2中的操作,见下一篇文章介绍: 
android基础总结:Camera2详解之二 官方demo解读及深入实现

https://blog.csdn.net/sjy0118/article/details/78748941

参考博客:

https://blog.csdn.net/zhangbijun1230/article/details/80556903

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术工厂 设计师:CSDN官方博客 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值