使用 android camera2 API 手动对焦

Rap*_*aël 6 api android focus lg android-camera2

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

我已经在谷歌示例Camera2 应用程序中添加了一个 SeekBar,但我找不到实现手动对焦的方法。

在 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);
}
Run Code Online (Sandbox Code Playgroud)

Edd*_*ala 6

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

关键是相机设备的可用功能是否列出MANUAL_SENSOR。如果是这样,那么您可以通过将自动对焦模式设置为关闭来控制镜头,然后将镜头焦距设置为您想要的值。如果未列出 MANUAL_SENSOR,则该设备很可能不支持手动对焦控制(不幸的是,某些制造商为其默认相机应用程序使用专用接口来实现手动对焦控制)。

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


Ale*_*rev 5

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);
}
Run Code Online (Sandbox Code Playgroud)