Android相机2 API中的SCALER_CROP_REGION用于裁剪图像的区域,以实现缩放或调整图像的视角。然而,在使用SCALER_CROP_REGION时,可能会导致手动对焦无效的问题。以下是解决该问题的代码示例:
private static final int FOCUS_AREA_SIZE = 300;
private void setupCamera() {
// 获取相机设备
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
String cameraId = cameraManager.getCameraIdList()[0];
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
// 检查是否支持相机2 API
int deviceLevel = characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
if (deviceLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY) {
// 不支持相机2 API,直接返回
return;
}
// 配置相机
CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice camera) {
// 相机打开后的回调
mCameraDevice = camera;
createCaptureSession();
}
// 其他回调方法省略...
};
cameraManager.openCamera(cameraId, stateCallback, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
private void createCaptureSession() {
try {
// 创建相机捕获会话
final CaptureRequest.Builder builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
// 设置自动对焦模式
builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO);
// 设置手动对焦区域
Rect focusRect = new Rect(mPreviewWidth / 2 - FOCUS_AREA_SIZE / 2, mPreviewHeight / 2 - FOCUS_AREA_SIZE / 2,
mPreviewWidth / 2 + FOCUS_AREA_SIZE / 2, mPreviewHeight / 2 + FOCUS_AREA_SIZE / 2);
MeteringRectangle[] focusArea = {new MeteringRectangle(focusRect, MeteringRectangle.METERING_WEIGHT_MAX)};
builder.set(CaptureRequest.CONTROL_AF_REGIONS, focusArea);
// 设置预览Surface
Surface previewSurface = mPreviewSurface.getSurface();
builder.addTarget(previewSurface);
// 构建捕获请求
CaptureRequest captureRequest = builder.build();
// 设置捕获会话回调
CameraCaptureSession.StateCallback sessionCallback = new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
try {
// 设置重复捕获请求
session.setRepeatingRequest(captureRequest, null, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
// 其他回调方法省略...
};
// 创建捕获会话
mCameraDevice.createCaptureSession(Collections.singletonList(previewSurface), sessionCallback, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
上述代码中,先通过CameraManager获取相机设备,然后判断是否支持相机2 API。如果设备不支持相机2 API,则直接返回。接下来,通过CameraDevice.createCaptureRequest方法创建CaptureRequest.Builder对象,并设置自动对焦模式和手动对焦区域。最后,将预览Surface添加到捕获请求中,并通过CameraCaptureSession.setRepeatingRequest方法设置重复捕获请求。
通过以上代码,可以解决使用SCALER_CROP_REGION时手动对焦无效的问题。