1.CameraManager
相机的管理者:检测、描述、连接到相机设备。
(1)getCameraIdList():返回String[] ,当前连接的相机设备的id列表,包括可能被其他相机API客户端使用的相机。
注:此列表不包含只能用作逻辑多摄像头设备一部分的物理摄像头。
会抛出的异常:
CameraAccessException:如果CameraManager无法查询或打开相机设备,或者与打开的CameraDevice的连接不再有效,则会引发。
(2)getCameraCharacteristics(String cameraId): 返回CameraCharacteristics ,查询摄像机设备的功能。
会抛出的异常:
如果摄像头ID与任何已知的摄像头设备不匹配,则为IllegalArgumentException。
如果相机设备已断开连接,则CameraAccessException。
(3)openCamera(String cameraId,cameraDevice.StateCallback callback,Handler handler),打开给定Id的摄像头的连接。第一个参数指示打开哪个摄像头, 第二个参数stateCallback为相机的状态回调接口,第三个参数用来确定Callback在哪个线程执行,为null的话就在当前线程执行。
在同一应用程序中打开同一摄像头ID两次,同样会触发断开连接CameraDevice.StateCallback.onDisconnected(CameraDevice)的回调,并删除所有正在进行的任务。
如果设备断开连接,或者如果更高优先级的camera API客户端开始使用相机设备,则open可能会失败。如果打开相机设备失败,则将调用设备回调的onError方法,随后对相机设备的调用将抛出CameraAccessException。
会抛出的异常:
CameraAccessException 如果相机被设备策略禁用、已断开连接、正由更高优先级的相机API客户端使用,或者设备已达到其最大资源,并且无法打开此相机设备。
IllegalArgumentException 如果cameraId或回调为null,或者cameraId与getCameraIdList()返回的任何当前或以前可用的相机设备不匹配。
SecurityException 如果应用程序没有访问摄像头的权限,则出现SecurityException
注:openCamera可以直接打开的独立摄像机ID,但用作逻辑多摄像机一部分的物理摄像机ID无法打开。
(4)openCamera (String cameraId, Executor executor, CameraDevice.StateCallback callback) :第二个参数:回调和侦听器事件通过该执行器进行调度,提供了一种控制使用哪个线程的简单方法。要通过应用程序的主线程分派事件,可以使用Context.getMainExecutor()。
会抛出的异常:
CameraAccessException
IllegalArgumentException 如果cameraId、回调或执行器为空,或者cameraId与任何当前或以前可用的相机设备不匹配。
SecurityException
(5)setTorchMode(String cameraId,boolean enabled),在不打开相机的情况下设置闪光灯的模式。
2.CameraDevice
一个连接安卓设备的单一摄像头的代表,可以在高帧率下对图像捕捉和后期处理进行精确控制。
一个给定的相机设备可以提供两个级别的支持:有限的或完全的。有限的支持可能不支持Camera2API,所以在应用摄像头后,最好先获取权限级别,如果应用程序需要一个全支持的操作,那么在Manifest声明“android.hardware.camera.level.full”的特征。
(1)createCaptureRequest(int):创建一个CaptureRequest.Builder
参数:
TEMPLATE_MANUAL | 一个用于直接应用控制捕获参数的基本模板。 |
TEMPLATE_PREVIEW | 创建一个适合于相机预览窗口的请求。 |
TEMPLATE_RECORD | 创建一个适合于视频录制的请求。 |
TEMPLATE_STILL_CAPTURE | 创建一个适合于静态图像捕获的请求。 |
TEMPLATE_ZERO_SHUTTER_LAG | 创建一个适用于零快门延迟的请求。 |
TEMPLATE_VIDEO_SNAPSHOT | 在录制视频时创建一个适合静态图像捕捉的请求。 |
(2)close():尽可能快地关闭与这个相机设备的连接。
(3)createCaptureSession(List outputs, CameraCaptureSession.StateCallback callback, Handler handler)😕/创建相机捕获会话, 第一个参数是捕获数据的输出Surface列表, 第二个参数用于监听 Session 状态的CameraCaptureSession.StateCallback对象,是CameraCaptureSession的状态回调接口,当它创建好后会回调onConfigured方法,第三个参数用来确定Callback在哪个线程执行,为null的话就在当前线程执行(用于执行 CameraCaptureSession.StateCallback 的 Handler 对象,可以是异步线程的 Handler,也可以是主线程的 Handler)
会抛出的异常:
IllegalArgumentException 如果输出Surface不满足要求,则回调为null,或者handler为null,但当前线程没有looper。
CameraAccessException 如果相机设备不再连接或遇到致命错误
IllegalStateException如果相机设备已关闭
(4)getId():获取相机设备的ID,string类型
CameraDevice.StateCallback
onClosed(CameraDevice camera) | 当一个相机设备CameraDevice的close()方法时,这个方法就被调用 |
onDisconnected(CameraDevice camera) | 当相机设备不再可用时,这个方法就被调用 |
onError(CameraDevice camera, int error) | 当相机设备遇到严重错误时,这种方法就被调用了,错误见上表的常量 |
onOpened(CameraDevice camera) | 当相机完成打开操作后,这个方法就被调用 |
3.CameraCaptureSession
用于捕获相机的照片,一旦创建CameraCaptureSession,这个会话就会处于活动状态,除非相机又新建一个会话或者设备关闭。创建一个会话需要零点几秒的时间,因为它需要配置摄像机设备的内部管道,并分配内存缓冲区,以将图像发送到所需的目标。
(1)capture(CaptureRequest request, CameraCaptureSession.CaptureCallback listener, Handler handler),提交一个图像请求,以便被摄像机设备捕捉到。
(2)close(),异步关闭这个捕获会话。
(3)getDevice(),获取这个会话创建的摄像机设备。
(4)setRepeatingRequest(CaptureRequest request, CameraCaptureSession.CaptureCallback listener, Handler handler),请求不断地重复捕捉这个捕获会话的图像。
(5)stopRepeating(),取消重复捕捉请求
CameraCaptureSession.CaptureCallback
用于跟踪向相机提交CaptureRequest对象的进程,是在一个请求触发一个捕获开始时调用的(capture())
onCaptureBufferLost(CameraCaptureSession session, CaptureRequest request, Surface target, long frameNumber) | 如果捕获的单个缓冲区不能发送到它的目标Surface,就会调用该方法。 |
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) | 当摄像机设备开始捕捉请求的输出图像,在图像曝光开始时,或者当摄像机设备开始处理一个重新处理请求的输入图像时,这个方法就被调用了。 |
CameraCaptureSession.StateCallback
createCaptureSession() | 回调中用于接收关于相机捕捉会话状态的更新。 |
onActive(CameraCaptureSession session) | 当会话开始主动处理捕获请求时,将调用此方法。 |
onCaptureQueueEmpty(CameraCaptureSession session) | 当摄像机设备的输入捕捉队列变为空时,该方法将被调用,并准备接受下一个请求。 |
onClosed(CameraCaptureSession session) | 会话关闭触发 |
onConfigureFailed(CameraCaptureSession session) | 如果会话不能按照请求配置,则调用此方法。 |
onConfigured(CameraCaptureSession session) | 当摄像机设备完成配置时,这个方法就会被调用,会话可以开始处理捕获请求。 |
onReady(CameraCaptureSession session) | 每当会话不再需要处理请求时,就会调用此方法。 |
onSurfacePrepared(CameraCaptureSession session, Surface surface) | 当输出表的缓冲区预分配完成时,就会调用该方法。 |
CameraCharacteristics
描述摄像头设备的属性。
CameraManager的getCameraCharacteristics(String cameraId) 方法获取单个摄像头的CameraCharacteristics对象
CaptureRequest.Builder
捕获请求的构建器。
使用CameraDeviced的createCaptureRequest(int)方法获取
addTarget(Surface outputTarget) 向该请求的目标列表添加一个Surface。
build()构建CaptureRequest。
removeTarget(Surface outputTarget)从这个请求的目标列表中删除一个Surface。
set(Key key, T value) 设置各种参数,比如自动对焦,设置闪光灯。
setTag(Object tag) 为这个请求设置一个标记。
ImageReader
ImageReader类允许应用程序直接将图片数据渲染到Surface上 。
(1)acquireLatestImage() 从ImageReader的队列中获取最新的图像,删除较旧的Image
(2)acquireNextImage() 从ImageReader队列获取下一个图像
(3)close() 释放与此ImageReader相关的所有资源。
(4)getHeight() 图像的默认高度,以像素为单位
(5)getImageFormat() 图像的默认图像格式。
(6)getMaxImages() 从ImageReader获得的最大数量的图像
(7)getSurface() 获得一个可以用来为这个ImageReader生成图像的Surface
(8)getWidth() 图像的默认宽度,以像素为单位
(9)newInstance(int width, int height, int format, int maxImages) 为想要的大小和格式创建一个新的对象
(10)setOnImageAvailableListener(ImageReader.OnImageAvailableListener listener, Handler handler) 当一个新映像从ImageReader可用时,注册一个侦听器将被调用。
预览流程
拍照流程
录像流程