2017-01-29 6 views
0

Я пытаюсь отключить автоопределение, автофокус и авто-баланс белого в образце Camera2Basic Google. Вот мой код:Как отключить все автоматики в Android Camera2 API

private void disableAutomatics() { 
    try { 
     mPreviewRequestBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_OFF); 
     mPreviewRequestBuilder.set(CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE, CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE_OFF); 
     mPreviewRequestBuilder.set(CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE, CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE_OFF); 
     mPreviewRequestBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, .2f); 
     mPreviewRequestBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, 1000000L); 

     mPreviewRequest = mPreviewRequestBuilder.build(); 
     // Set new repeating request with our changed one 
     mCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback, mBackgroundHandler); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 

Проблема заключается в том, я не знаю, куда поместить этот метод в Camera2BasicFragment.java.

Любая помощь была бы принята с благодарностью.

ответ

1

Есть два места, где вы можете захотеть сделать эти настройки:

· Если вы хотите сделать это до начала просмотра, то лучше было бы внутри перекрытой метода onConfigured в createCameraPreviewSession() недействительная (строка 696 в файле Camera2BasicFragment предоставляется в компании Google Camera2Basic образца:

private void createCameraPreviewSession() { 
    try { 
     SurfaceTexture texture = mTextureView.getSurfaceTexture(); 
     assert texture != null; 

     // We configure the size of default buffer to be the size of camera preview we want. 
     texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); 

     // This is the output Surface we need to start preview. 
     Surface surface = new Surface(texture); 

     // We set up a CaptureRequest.Builder with the output Surface. 
     mPreviewRequestBuilder 
       = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 
     mPreviewRequestBuilder.addTarget(surface); 

     // Here, we create a CameraCaptureSession for camera preview. 
     mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()), 
       new CameraCaptureSession.StateCallback() { 

        @Override 
        public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { 
         // The camera is already closed 
         if (null == mCameraDevice) { 
          return; 
         } 

         // When the session is ready, we start displaying the preview. 
         mCaptureSession = cameraCaptureSession; 
         try { 


          //Place here your custom camera settings 


          // Start displaying the camera preview. 
          mPreviewRequest = mPreviewRequestBuilder.build(); 
          mCaptureSession.setRepeatingRequest(mPreviewRequest, 
            mCaptureCallback, mBackgroundHandler); 
         } catch (CameraAccessException e) { 
          e.printStackTrace(); 
         } 
        } 

        @Override 
        public void onConfigureFailed(
          @NonNull CameraCaptureSession cameraCaptureSession) { 
         showToast("Failed"); 
        } 
       }, null 
     ); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 

· Если вы хотите сделать настройки после просмотра начала и во время выполнения просто позвоните вашим disableAutomatics() из пользовательского интерфейса или где-нибудь еще и он должен работать нормально.

Обратите внимание, что вам не нужно, чтобы закрыть старую CaptureSession вызывая его CaptureSession.close() метод, как описано в ответе на this other question, потому что новый заменяет старую один.


Однако я не уверен, что установка значения времени экспозиции вручную, как вы делали в вашем вопросе

mPreviewRequestBuilder.set (CaptureRequest.SENSOR_EXPOSURE_TIME, 1000000L);

потому что вы можете получить неожиданные результаты. То, что я знаю, что сделать это, как правило, не рекомендуется, и это предпочли вместо того, чтобы позволить камере настроить на свой собственный, а затем вызвать AE (автоэкспозиции) замок:

mPreviewRequestBuilder.set(CaptureRequestCONTROL_AE_LOCK, true); 

Вы можете проверить ссылку CONTROL_AE_LOCK here.

Но если вашему коду требуется фиксированное время экспозиции, оно должно работать.