返回

Android Camera2实现预览拍照功能入门

Android

相机2 API:解锁 Android 相机的全部潜力

简介

对于 Android 开发者而言,掌握相机功能至关重要。Camera2 API 提供了一系列强大的工具,使开发者能够构建出色的相机应用。通过使用 Camera2,开发者可以充分利用 Android 相机的先进功能,为用户提供无与伦比的拍照体验。

认识 Camera2

Camera2 API 引入了众多新功能和改进,赋予开发者对相机硬件和处理过程的更多控制。与 Camera1 相比,Camera2 的主要优势包括:

  • 更灵活的相机控制: 可调整曝光、对焦和其他设置。
  • 支持 RAW 图像格式: 提供更大的后期处理灵活性。
  • 增强了性能和效率: 最大限度地提高相机性能。

实现相机预览

要使用 Camera2 实现相机预览,请遵循以下步骤:

  1. 创建 CameraManager 对象: 用于管理相机设备。
  2. 打开相机设备并创建 CameraDevice 对象: 代表物理相机设备。
  3. 创建 CameraCaptureSession: 用于捕获相机数据。
  4. 创建 SurfaceTexture: 用于显示预览图像。
  5. 创建 Surface: 将预览图像呈现到 SurfaceTexture 上。
  6. 配置 CameraCaptureSession: 将输出配置为 Surface。
  7. 启动 CameraCaptureSession: 开始预览图像。

示例代码:相机预览

private fun createCameraPreviewSession() {
    val surfaceTexture = textureView.surfaceTexture
    surfaceTexture.setDefaultBufferSize(previewSize.width, previewSize.height)
    val surface = Surface(surfaceTexture)

    val captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)
    captureRequestBuilder.addTarget(surface)

    cameraDevice.createCaptureSession(listOf(surface), object : CameraCaptureSession.StateCallback() {
        override fun onConfigured(session: CameraCaptureSession) {
            captureSession = session
            captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)
            captureSession.setRepeatingRequest(captureRequestBuilder.build(), null, backgroundHandler)
        }

        override fun onConfigureFailed(session: CameraCaptureSession) {}
    }, backgroundHandler)
}

实现拍照

要使用 Camera2 实现拍照,请遵循以下步骤:

  1. 创建 ImageReader: 用于接收 JPEG 图像数据。
  2. 创建 CaptureRequest.Builder: 用于构建拍照请求。
  3. 创建 CameraCaptureSession: 用于捕获相机数据。
  4. 将 ImageReader 添加到 CameraCaptureSession 的输出列表: 接收 JPEG 图像。
  5. 配置 CameraCaptureSession: 将输出配置为 ImageReader。
  6. 使用 CaptureRequest.Builder 创建拍照请求并提交: 捕获图像。
  7. 从 ImageReader 获取 JPEG 图像数据: 处理捕获的图像。

示例代码:拍照

private fun takePicture() {
    val captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE)
    captureRequestBuilder.addTarget(imageReader.surface)
    captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)

    cameraDevice.createCaptureSession(listOf(imageReader.surface), object : CameraCaptureSession.StateCallback() {
        override fun onConfigured(session: CameraCaptureSession) {
            session.capture(captureRequestBuilder.build(), null, backgroundHandler)
        }

        override fun onConfigureFailed(session: CameraCaptureSession) {}
    }, backgroundHandler)
}

结论

Camera2 API 为 Android 开发者提供了打造卓越相机应用的工具。通过遵循本文中的步骤,开发者可以实现相机预览、拍照以及其他高级功能。充分利用 Camera2 的功能,为用户提供难忘的拍照体验。

常见问题解答

1. Camera2 相对于 Camera1 有什么优势?

Camera2 提供了对相机硬件的更精细控制、支持 RAW 图像格式以及更高的性能和效率。

2. 如何实现相机变焦?

可以通过调整 CaptureRequest.Builder 中的 SCALER_CROP_REGION 设置来实现相机变焦。

3. 如何处理图像处理请求?

可以使用 ImageAnalysis 类来处理图像数据并执行诸如人脸检测之类的操作。

4. 如何在低光照条件下优化相机性能?

可以调整 CaptureRequest.Builder 中的 CONTROL_AE_MODECONTROL_AE_TARGET_FPS_RANGE 设置来优化相机在低光照条件下的性能。

5. 如何使用 Camera2 API 创建自定义相机控件?

可以通过创建自定义 CameraControl 实现并将其添加到 CameraCaptureSessionSessionParameters 中来创建自定义相机控件。