引言

Android Camera2 API 是 Android 系统中用于处理摄像头硬件的现代化接口。相较于传统的 Camera API,Camera2 提供了更高的灵活性和更丰富的功能。本文将带你从入门到精通 Android Camera2,解锁摄影新境界。

一、Camera2 简介

1.1 Camera2 的优势

异步操作:Camera2 采用异步操作模式,可以释放 CPU 资源,提高系统响应速度。

更低延迟:通过硬件加速和更灵活的缓冲区管理,Camera2 可以实现更低的延迟。

更多控制:Camera2 提供了更丰富的摄像头参数控制,如曝光、白平衡、对焦等。

1.2 Camera2 的适用场景

专业摄影应用:如相机、视频拍摄等需要高性能、高画质的应用。

实时图像处理:如 AR、VR 等需要实时处理图像的应用。

二、Camera2 入门

2.1 开发环境准备

Android Studio:建议使用最新版本的 Android Studio,以便支持最新的 Camera2 API。

Android 设备或模拟器:准备一台支持 Camera2 API 的 Android 设备或模拟器。

2.2 添加 Camera2 权限

在 AndroidManifest.xml 中添加以下权限:

2.3 获取 CameraManager

通过 CameraManager 获取摄像头设备:

CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);

三、Camera2 使用详解

3.1 打开摄像头

String cameraId = manager.getCameraIdList()[0]; // 获取第一个摄像头的 ID

manager.openCamera(cameraId, stateCallback, null);

3.2 设置预览

创建 CameraDevice.StateCallback 回调接口

在回调接口的 onOpened 方法中设置预览

CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() {

@Override

public void onOpened(@NonNull CameraDevice camera) {

try {

// 创建预览的 CaptureRequest.Builder

SurfaceTexture texture = surfaceTexture;

assert texture != null;

texture.setDefaultBufferSize(imageSize.getWidth(), imageSize.getHeight());

Surface surface = new Surface(texture);

CaptureRequest.Builder builder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);

builder.addTarget(surface);

// 设置预览参数

camera.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() {

@Override

public void onConfigured(@NonNull CameraCaptureSession session) {

if (camera == null) return;

cameraCaptureSession = session;

try {

// 自动对焦

CaptureRequest.Builder previewBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);

previewBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);

cameraCaptureSession.setRepeatingRequest(previewBuilder.build(), null, null);

} catch (CameraAccessException e) {

e.printStackTrace();

}

}

@Override

public void onConfigureFailed(@NonNull CameraCaptureSession session) {

Toast.makeText(CameraActivity.this, "配置失败", Toast.LENGTH_SHORT).show();

}

}, null);

} catch (CameraAccessException e) {

e.printStackTrace();

}

}

@Override

public void onDisconnected(@NonNull CameraDevice camera) {

camera.close();

}

@Override

public void onError(@NonNull CameraDevice camera, int error) {

camera.close();

}

};

3.3 拍照

创建 CaptureRequest.Builder,设置拍照参数

使用 CameraCaptureSession 的 capture 方法执行拍照

CaptureRequest.Builder builder = camera.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);

builder.addTarget(imageReader.getSurface());

builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF);

cameraCaptureSession.capture(builder.build(), new CameraCaptureSession.CaptureCallback() {

@Override

public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {

// 拍照成功后的处理

}

});

3.4 录制视频

创建 CaptureRequest.Builder,设置视频参数

使用 CameraCaptureSession 的 setRepeatingRequest 方法录制视频

”`java

CaptureRequest.Builder videoBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);

videoBuilder.addTarget(videoEncoder.get