1

下面的代碼片段無法爲具有固定焦距的預覽創建CaptureRequest。即使TotalCaptureRequest的報告另有說明,預覽中顯示的圖像也始終集中在無限遠處。創建固定焦距預覽所需的最小CaptureRequest

以下是代碼片段:

mPreviewBuilder = mCameraDevice.createCaptureRequest(SCameraDevice.TEMPLATE_PREVIEW); 
mPreviewBuilder.set(SCaptureRequest.LENS_FOCUS_DISTANCE, 9.5f); 
mPreviewBuilder.set(SCaptureRequest.CONTROL_AF_MODE, SCaptureRequest.CONTROL_AF_MODE_OFF); 

我的設備是一個三星Galaxy S7其中報道了背面相機的以下屬性: [代碼] CAMID:0 LensFace:BACK HwdSupportLevel:FULL SensorOrientation :90 LensCalibration:CALIBRATED LensMinFocusDist:10.0 [/代碼]

這是我的日誌時的onCaptureComplete()

callback: AF_STATE: 0 Lens Focus Distance: 9.555555 LENS_STATE: 0 HAS FOCUS RANGE: true Focus Range Min: 9.762765, Max: 9.348346 
捕獲

我已經與普通老式的Android Camera2 API以及與三星SDK試過這種(在這裏找到:http://developer.samsung.com/galaxy/camera

三星自家的相機應用和攝像頭FV-5的支持,沒有任何問題,這個功能。

我如何得到這個工作?

添加一些代碼上下文

/** 
* Start the camera preview. 
*/ 
private void startPreview() { 
    if (null == mCameraDevice || !mTextureView.isAvailable() || null == mPreviewSize) { 
     return; 
    } 
    try { 
     closePreviewSession(); 
     SurfaceTexture texture = mTextureView.getSurfaceTexture(); 
     assert texture != null; 
     texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); 
     mPreviewBuilder = mCameraDevice.createCaptureRequest(SCameraDevice.TEMPLATE_PREVIEW); 
     //mPreviewBuilder.set(SCaptureRequest.CONTROL_CAPTURE_INTENT, SCaptureRequest.CONTROL_CAPTURE_INTENT_MANUAL); 
     //mPreviewBuilder.set(SCaptureRequest.CONTROL_MODE, SCaptureRequest.CONTROL_MODE_OFF); 
     mPreviewBuilder.set(SCaptureRequest.CONTROL_AF_MODE, SCaptureRequest.CONTROL_AF_MODE_OFF); 
     mPreviewBuilder.set(SCaptureRequest.CONTROL_AE_MODE, SCaptureRequest.CONTROL_AE_MODE_ON); 
     mPreviewBuilder.set(SCaptureRequest.LENS_FOCUS_DISTANCE, 9.5f); 

     Surface previewSurface = new Surface(texture); 
     mPreviewBuilder.addTarget(previewSurface); 

     mCameraDevice.createCaptureSession(Arrays.asList(previewSurface), new SCameraCaptureSession.StateCallback() { 

      @Override 
      public void onConfigured(SCameraCaptureSession cameraCaptureSession) { 
       mPreviewSession = cameraCaptureSession; 
       updatePreview(); 
      } 

      @Override 
      public void onConfigureFailed(SCameraCaptureSession cameraCaptureSession) { 
       Toast.makeText(getApplicationContext(),"Failed", Toast.LENGTH_SHORT).show(); 
      } 
     }, mBackgroundHandler); 


    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 


/** 
* Update the camera preview. {@link #startPreview()} needs to be called in advance. 
*/ 
private void updatePreview() { 
    if (null == mCameraDevice) { 
     return; 
    } 
    try { 
     setUpCaptureRequestBuilder(mPreviewBuilder); 
     HandlerThread thread = new HandlerThread("CameraPreview"); 
     thread.start(); 
     mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), mCaptureCallBack, mBackgroundHandler); 
     Log.i(TAG, "New Session values, control mode " + mPreviewBuilder.get(SCaptureRequest.CONTROL_MODE) + 
       ", AF mode: " + mPreviewBuilder.get(SCaptureRequest.CONTROL_AF_MODE) + 
       ", Focus value; " + +mPreviewBuilder.get(SCaptureRequest.LENS_FOCUS_DISTANCE)); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 

回答

0

你有沒有添加了表面您mPreviewBuilder?

Surface surface = new Surface(texture); 
//Add surfaces 
mPreviewBuilder.addTarget(surface); 
surfaces.add(surface); 

二,設置您的AF_MODE熄滅前設置LENS_FOCUS_DISTANCE,最後用setRepeatingRequest在你CaptureSesion更新使sesion。有了它,它必須工作。

mCaptureSession.setRepeatingRequest(mPreviewBuilder.build(), 
       callback, mHandler); 

檢查與記錄您的CaptureRequest的值來檢查一切是正確的,你不重疊的東西在你的AF:

Log.i(TAG, "New Session values, control mode " + mPreviewRequestBuilder.get(CaptureRequest.CONTROL_MODE) + 
      ", AF mode: " + mPreviewRequestBuilder.get(CaptureRequest.CONTROL_AF_MODE) + 
      ", Focus value; " + +mPreviewRequestBuilder.get(CaptureRequest.LENS_FOCUS_DISTANCE)); 
+0

@Durdins還不行。以下是日誌中的值:新建會話值,控制模式1,自動對焦模式:0,焦點值; 9.5 – unshul

+0

這意味着您的captureRequest具有正確的值。你正在更新你的預覽?在設置新值之後對您的CaptureSession執行一個新的setRepeatingRequest,並且它應該使用新的請求生成器值更新預覽 –

+0

@Durdins:我想我正在設置請求並按照您的建議進行預覽(我已更新了原始帖子,一些更多的上下文),但重點值仍然不會對預覽產生影響。 – unshul