使用 android camera2 API 手动对焦

Manual Focus using android camera2 API

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

我已经在 google 示例中添加了一个 SeekBar Camera2 app 但是我找不到实现手动对焦的方法。

我找到了 ,但它不适用于我的 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);
}

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

关键是available capabilities of the camera device lists MANUAL_SENSOR. If so, then you can control the lens by setting the autofocus mode to OFF, and then setting the lens focus distance是否达到你想要的值。如果未列出 MANUAL_SENSOR,则该设备很可能不支持手动对焦控制(不幸的是,某些制造商的默认相机应用程序使用私有接口来实现手动对焦控制)。

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

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);
}