使用android camera2 API手动对焦

时间:2017-03-20 10:34:22

标签: android api focus android-camera2 lg

我想为自己开发一款Android相机应用程序(如果有兴趣的人可以共享它),在视频录制时有手动对焦。

我在Google样本Camera2 app中添加了一个SeekBar,但我找不到实现手动焦点的方法。

我找到了Manual focus in camera2, android,但它对我的LG G4无效。 相机应用程序几乎是完美的,因为它不允许手动对焦在视频模式。

你们中有谁有想法吗?

编辑:这是SeekBar监听器的代码:

@Override
public void onStopTrackingTouch(SeekBar seekBar) {}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {
    mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_OFF);
}

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    float minimumLens = characteristics.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE);
    float num = (((float)progress) * minimumLens / 100);
    mPreviewBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, num);
}

2 个答案:

答案 0 :(得分:4)

您需要检查您运行的设备是否实际支持camera2中的手动控制。

关键是相机设备的available capabilities是否列出MANUAL_SENSOR。如果是这样,则可以通过将autofocus mode设置为OFF,然后将lens focus distance设置为所需的值来控制镜头。如果未列出MANUAL_SENSOR,则设备很可能不支持手动对焦控制(不幸的是,有些制造商使用专用接口为其默认相机应用程序实现手动对焦控制)。

这些都应该进入你用来控制预览的重复请求。

答案 1 :(得分:3)

Eddy Talvala在他的回答中正确地描述了一切,但是如果你仍然觉得复杂,这里有一个代码片段,它将焦点设置为无穷大(其值为0f):

CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
int[] capabilities = characteristics
    .get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);

boolean isManualFocusSupported = IntStream.of(capabilities)
    .anyMatch(x -> x == CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR);

if (isManualFocusSupported) {
    previewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF);
    previewBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, 0f);
}