2017-03-20 169 views
1

我想爲自己開發一款適用於自己的Android相機應用程序(如果有興趣的人可以分享它),在錄製視頻時需要手動對焦。使用android camera2進行手動對焦API

我已經添加了一個SeekBar到谷歌示例Camera2 app,但我找不到實現手動對焦的方式。

我發現Manual focus in camera2, android但它不起作用在我的LG G4上。 股票相機應用程序幾乎是完美的,因爲它不允許在視頻模式下手動對焦。

有沒有人有想法?

編輯:這裏的搜索欄聽者的代碼:

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

回答

3

您需要檢查,如果你在實際運行的設備支持camera2手動控制。

關鍵是相機設備的available capabilities是否列出MANUAL_SENSOR。如果是這樣,那麼您可以通過將autofocus mode設置爲OFF來控制鏡頭,然後將lens focus distance設置爲所需的值。如果沒有列出MANUAL_SENSOR,那麼該設備很可能不支持手動對焦控制(不幸的是,一些製造商使用專用接口來執行手動對焦控制,以實現手動對焦控制)。

這些都應該進入您用來控制預覽的重複請求。

+0

有一個APK(HTTPS: //play.google.com/store/apps/details?id=com.sdgsystems.camera2probe)瞭解設備是否支持Camera2 API,並且LG G4有全面的支持,並列出了MANUAL_SENSOR。我試圖將自動對焦模式設置爲OFF,但是當我將鏡頭焦距設置爲SeekBar的值時,它不會執行任何操作。我編輯了我的主帖,添加了我的代碼。 – Rallph

+1

更新預覽構建器值後,你在哪裏調用mSession.setRepeatingRequest(mPreviewBuilder.build())? –

+0

我實際上不叫它,但它在'onProgressChanged()'中嘗試時有效,非常感謝! – Rallph

0

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