2017-01-29 4 views
0

GoogleのCamera2Basicサンプルで自動露出、オートフォーカス、オートホワイトバランスを無効にしようとしています。ここに私のコード: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

あなたはそれらの設定を行うことをお勧めします2ヶ所があります。

・プレビューを開始する前に、あなたがそれをしたい場合は、より良い場所がcreateCameraPreviewSession内onConfiguredオーバーライドメソッドの内側になります()

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を(呼び出した後に設定を行いたい場合は)UIからか:GoogleのCamera2Basicサンプルで提供Camera2BasicFragmentファイル内のボイド(ライン696どこか他のそれは正常に動作するはずです。新しい古いものを置き換えるためthis other questionへの回答で説明したように、あなたがそのCaptureSession.close()メソッドを呼び出すことによって、古いCaptureSessionを閉じる必要はありません

注意。


は、しかし、私はあなたがあなたの質問

mPreviewRequestBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME、1000000L)で行ったように、手動で露出時間値の設定について確認していません。

予期しない結果が生じる可能性があるためです。

mPreviewRequestBuilder.set(CaptureRequestCONTROL_AE_LOCK, true); 

あなたはCONTROL_AE_LOCK参照hereを確認することができます。私が知っていることはそうすることが通常推奨され、カメラは、独自で調整した後、AE(自動露出)ロックを呼び出すようにする代わりに好適であるということです。

しかし、あなたのコードが一定の露出時間を必要とする場合、それはうまくいくはずです。

関連する問題