引言
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