Android Camera2 之 CameraDevice 详解

一、简介

CameraDevice 是一个连接的相机设备代表,你可以把它看作为相机设备在 java 代码中的表现。类比于旧 API 中的 Camera 类。

官方文档链接:https://developer.android.google.cn/reference/android/hardware/camera2/CameraDevice

二、获取 CameraDevice 实例

通过 CameraManageropenCamera() 方法打开相机,在 CameraDevice.StateCallbackonOpened(CameraDevice camera) 方法中可获得 CameraDevice 的实例。

示例:

    private int mCameraId = CameraCharacteristics.LENS_FACING_FRONT;
    private CameraManager mCameraManager; // 相机管理者
    private CameraDevice mCameraDevice; // 相机对象
    private Handler mBackgroundHandler;
    private HandlerThread mBackgroundThread;

    private CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() {
        @Override
        public void onOpened(@NonNull CameraDevice camera) {
            mCameraDevice = camera; // 获取到可用的 CameraDevice 实例
            // 当相机成功打开时回调该方法,接下来可以执行创建预览的操作
        }

        @Override
        public void onDisconnected(@NonNull CameraDevice camera) {
            // 当相机断开连接时回调该方法,应该在此执行释放相机的操作
        }

        @Override
        public void onError(@NonNull CameraDevice camera, int error) {
            // 当相机打开失败时,应该在此执行释放相机的操作
        }

        @Override
        public void onClosed(@NonNull CameraDevice camera) {
            // 当相机关闭时回调该方法,这个方法可以不用实现
        }
    };

    public void openCamera() {
        try {
            // 前处理
            mCameraManager.openCamera(Integer.toString(mCameraId), mStateCallback, mBackgroundHandler);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }

三、内部类

只有一个 CameraDevice.StateCallback 的内部类,当相机状态发生变化时,会调用该类相应的回调方法。

相应的回调方法介绍在上面的示例中已经说明了,下面介绍一下 onError 回调方法中相应的错误码把:

错误码描述
CameraDevice.StateCallback.ERROR_CAMERA_IN_USE当前相机设备已经在一个更高优先级的地方打开了
CameraDevice.StateCallback.ERROR_MAX_CAMERAS_IN_USE已打开相机数量到上限了,无法再打开新的相机了
CameraDevice.StateCallback.ERROR_CAMERA_DISABLED由于相关设备策略该相机设备无法打开,详细可见 DevicePolicyManagersetCameraDisabled(ComponentName, boolean) 方法
CameraDevice.StateCallback.ERROR_CAMERA_DEVICE相机设备发生了一个致命错误
CameraDevice.StateCallback.ERROR_CAMERA_SERVICE相机服务发生了一个致命错误

四、常用方法

1. void close()

关闭对应的相机设备。

2. CaptureRequest.Builder createCaptureRequest(int templateType)

使用指定模板创建一个 CaptureRequest.Builder 用于新的捕获请求构建。

templateType描述适用性
TEMPLATE_PREVIEW用于创建一个相机预览请求。相机会优先保证高帧率而不是高画质所有相机设备
TEMPLATE_STILL_CAPTURE用于创建一个拍照请求。相机会优先保证高画质而不是高帧率所有相机设备
TEMPLATE_RECORD用于创建一个录像请求。相机会使用标准帧率,并设置录像级别的画质所有相机设备
TEMPLATE_VIDEO_SNAPSHOT用于创建一个录像时拍照的请求。相机会尽可能的保证照片质量的同时不破坏正在录制的视频质量硬件支持级别高于 LEGACY 的相机设备
TEMPLATE_ZERO_SHUTTER_LAG用于创建一个零延迟拍照的请求。相机会尽可能的保证照片质量的同时不损失预览图像的帧率,3A(自动曝光、自动聚焦、自动白平衡)都为 auto 模式支持 PRIVATE_REPROCESSINGYUV_REPROCESSING 的相机设备
TEMPLATE_MANUAL用于创建一个手动控制相机参数的请求。相机所有自动控制将被禁用,后期处理参数为预览质量,手动控制参数被设置为合适的默认值,需要用户自己根据需求来调整各参数支持 MANUAL_SENSOR 的相机设备

3. void createCaptureSession(List outputs, CameraCaptureSession.StateCallback callback, Handler handler)

使用一个指定的 Surface 输出列表创建一个相机捕捉会话。

参数说明:

  • outputs : 输出的 Surface 集合,每个 CaptureRequest 的输出 Surface 都应该是 outputs 的一个子元素。
  • callback : 创建会话的回调。成功时将调用 CameraCaptureSession.StateCallback 的 onConfigured(CameraCaptureSession session) 方法。
  • handler : 指定回调执行的线程,传 null 时默认使用当前线程的 Looper。

4. String getId()

获得当前相机设备的 id。

5. 示例

针对第二条和第三条,简单的使用如下:

try {
    // templateType 使用 TEMPLATE_PREVIEW,即创建一个相机预览请求
    mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
    mCaptureRequestBuilder.addTarget(mPreviewSurface); // 设置预览输出的 Surface
    // mPreviewSurface 是用于预览输出的 Surface
    // mImageReader.getSurface() 是用于拍照输出的 Surface
    mCameraDevice.createCaptureSession(Arrays.asList(mPreviewSurface, mImageReader.getSurface()),
            new CameraCaptureSession.StateCallback() {

        @Override
        public void onConfigured(@NonNull CameraCaptureSession session) {
            if (mCameraDevice == null) {
                return;
            }
            mCaptureSession = session;
            try {
                // 设置连续自动对焦
                mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
                // 设置关闭闪光灯
                mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.FLASH_MODE_OFF);
                // 生成一个预览的请求
                mPreviewRequest = mPreviewRequestBuilder.build();
                // 开始预览,即设置反复请求
                mCaptureSession.setRepeatingRequest(mPreviewRequest, null, mBackgroundHandler);
            } catch (CameraAccessException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onConfigureFailed(@NonNull CameraCaptureSession session) {
            Log.e(TAG, "ConfigureFailed.");
        }
    }, mBackgroundHandler);
} catch (CameraAccessException e) {
    e.printStackTrace();
}

五、硬件支持等级

上面介绍适用性时提到了硬件支持级别。在 Camera2 中,相机设备支持的硬件等级有

LEVEL_3 > FULL > LIMIT > LEGACY

对于大多数的手机而言,都会支持到 FULLLIMIT。当支持到 FULL 等级的相机设备,将拥有比旧 API 强大的新特性,如 30fps 全高清连拍,帧之间的手动设置,RAW 格式的图片拍摄,快门零延迟以及视频速拍等,否则和旧 API 功能差别不大。

获取方式:

通过 CameraCharacteristics 类获取相机设备的特性,包括硬件等级的支持等级.

CameraCharacteristics characteristics = mCameraManager.getCameraCharacteristics(mCameraId);
int hardwareLevel = characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
  • 9
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: Android Camera2 API是Android系统提供的一种新的相机框架,用于实现相机预览和采集功能。Camera2 API可以提供更强大、更灵活的相机控制和图像处理能力。 相比于传统的Camera API,Camera2 API具有以下优势: 1. 能够同时管理多个相机设备:Camera2 API支持同时管理多个相机设备,包括前置摄像头、后置摄像头、深度摄像头等,可以方便地进行相机切换和管理。 2. 提供更灵活的相机控制:Camera2 API提供了更丰富的相机控制选项,可以精确地设置曝光时间、ISO值、焦距等参数,以便于用户根据不同的拍摄场景进行调整。 3. 支持原生的相机预览和采集:Camera2 API提供了对原生的预览和采集数据的支持,可以更高效地获取图像数据,用户可以利用这些数据进行实时的图像处理或者保存。 4. 支持原生的相机回调:Camera2 API提供了原生的相机回调接口,用户可以通过设置回调函数来实时获取相机的状态和图像数据,从而实现一些特殊的相机功能,如实时人脸检测、连拍等。 总之,Android Camera2 API提供了更强大、更灵活的相机功能,可以满足开发者对相机预览和采集的各种需求。无论是在智能手机、平板电脑还是其他移动设备上,都可以通过Camera2 API来实现高质量的相机应用。 ### 回答2: Android Camera 2是Android系统中用于处理相机功能的全新API。相较于之前的Camera API,Camera 2更加强大和灵活,提供了更多的功能和优化。 在Android Camera 2中,预览采集是通过创建一个CameraDevice实例来实现的。首先,需要获取相机的相关信息,例如相机的ID、参数等。然后,通过调用CameraManager的openCamera方法来打开指定ID的相机。 在相机打开后,可以通过创建一个CaptureRequest.Builder对象来配置相机的预览设置。可以设置预览的目标Surface、预览图像的尺寸、帧率等。然后,通过调用createCaptureSession方法,传入预览的目标Surface和一个CameraCaptureSession.StateCallback来创建一个预览会话。 在预览会话创建后,可以调用setRepeatingRequest方法来开始预览。Camera2会自动将预览帧数据传输到指定的Surface上,并在Surface上更新预览图像。同时,可以通过设置回调函数来处理预览数据,例如实时显示预览图像、进行进一步的图像处理等。 在预览过程中,还可以根据需要调整相机的参数,例如调整曝光度、焦距、白平衡等。通过创建新的CaptureRequest.Builder对象并设置相应参数,然后调用Session的setRepeatingRequest方法,可以实现动态调整相机参数。 总而言之,Android Camera 2提供了更强大和灵活的方式来实现相机预览采集。通过合理地使用Camera2的API,我们可以轻松地实现各种功能,例如实时预览、图像处理、动态调整参数等。 ### 回答3: Android Camera2预览采集是通过使用Android操作系统的Camera2 API来实现的一种方式。Camera2 API是Android 5.0(Lollipop)版本引入的相机框架,它提供了更多的功能和灵活性,用于控制和管理Android设备上的相机。 使用Camera2 API进行预览采集是一种相对较新和高级的方法,相比传统的Camera API,Camera2 API提供了更多的控制选项和功能,以及更好的性能和稳定性。 通过Camera2 API,我们可以实时地从Android设备的摄像头获取图像,并将图像传输到屏幕上进行实时预览。预览采集可以在应用程序中使用,例如用于视频通话、拍照、视频录制等场景。 Camera2 API的预览采集过程主要涉及以下步骤: 1. 获取相机设备:通过CameraManager类获取设备的摄像头列表,并选择要使用的摄像头设备。 2. 创建相机会话:使用CameraDevice类进行连接和建立与相机设备的会话。 3. 创建预览请求:使用CaptureRequest.Builder类创建一个预览请求,并设置相应的参数,例如预览尺寸、帧率等。 4. 创建预览会话:使用CameraDevice类创建预览会话,并将预览请求设置为预览会话的目标。 5. 开启预览:将预览会话设置为活动状态,相机将开始实时地捕获图像,并通过指定的Surface进行预览。 通过这些步骤,我们可以在Android设备上实现相机预览采集功能,并根据需要进行自定义设置和扩展。预览采集可以进一步应用于更多的相机应用场景,例如人脸识别、图像处理等。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值