Camera2 API,使用相机预览时设置预览尺寸
时间: 2023-12-02 21:05:15 浏览: 234
Android Camera2 实现预览功能
5星 · 资源好评率100%
在 Camera2 API 中,可以使用以下步骤设置相机预览尺寸:
1. 获取相机设备的 CameraCharacteristics。这可以通过 CameraManager.getCameraCharacteristics() 方法获取。
2. 从 CameraCharacteristics 中获取 StreamConfigurationMap 对象,它包含了所有相机支持的输出流配置信息。
3. 从 StreamConfigurationMap 中获取预览输出的所有尺寸列表,使用 getOutputSizes() 方法获取。
4. 选择一个合适的尺寸作为预览尺寸,可以根据需要进行筛选或排序。
5. 创建一个合适的 Surface 对象作为预览输出目标,例如 SurfaceTexture 或 SurfaceView。
6. 创建一个 CaptureRequest.Builder 对象,并设置预览输出目标及其尺寸。
7. 创建一个 CameraCaptureSession 实例,并将预览请求添加到会话中。
8. 启动相机预览。
以下是一个示例代码片段:
```
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String cameraId = cameraManager.getCameraIdList()[0];
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
Size[] sizes = map.getOutputSizes(SurfaceTexture.class);
// 选择一个合适的预览尺寸
Size previewSize = sizes[0];
// 创建 SurfaceTexture 作为预览输出目标
SurfaceTexture surfaceTexture = new SurfaceTexture(0);
try {
// 创建 CaptureRequest.Builder 对象,并设置预览输出目标及其尺寸
CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.addTarget(new Surface(surfaceTexture));
builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
builder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
builder.set(CaptureRequest.SCALER_CROP_REGION, zoom);
builder.set(CaptureRequest.JPEG_QUALITY, (byte) 100);
builder.set(CaptureRequest.CONTROL_SCENE_MODE, CaptureRequest.CONTROL_SCENE_MODE_LANDSCAPE);
// 创建 CameraCaptureSession 实例,并将预览请求添加到会话中
cameraDevice.createCaptureSession(Collections.singletonList(surfaceTexture),
new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession session) {
try {
session.setRepeatingRequest(builder.build(), null, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(CameraCaptureSession session) {
Toast.makeText(MainActivity.this, "Failed", Toast.LENGTH_SHORT).show();
}
}, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
```
注意,在实际应用中,需要处理 CameraAccessException 异常,并在不需要使用相机时释放相机资源。
阅读全文