2016-12-11 2 views
0

Je suis en train de développer une application, basée sur l'exemple Google Camera2Basic, qui utilise Camera 2 API. Je voudrais ajouter un bouton qui me permette de changer le mode flash.Android Camera2 - Changer le mode flash

Le problème est lorsque je clique sur le bouton pour basculer entre les différents modes de flash, le captureBuilder ne définit pas le mode de flash correct. C'est un travail seulement quand j'ouvre l'appareil photo pour la première fois.

méthode setFlash:

private void setFlash(CaptureRequest.Builder requestBuilder) { 
    if (mFlashSupported) { 
     switch (mFlashMode) { 
      case FLASH_AUTO: 
       requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); 
       requestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF); 
       break; 
      case FLASH_ON: 
       rrequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_ALWAYS_FLASH); 
       requestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_SINGLE); 
       break; 
      case FLASH_OFF: 
       requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON); 
       requestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF); 
       break; 
     } 
    } 
} 

procédé createCameraPreviewSession:

private void createCameraPreviewSession() { 
    try { 
     ... 

     mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()), 
       new CameraCaptureSession.StateCallback() { 

        @Override 
        public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) { 
         if (null == mCameraDevice) { 
          return; 
         } 

         mCaptureSession = cameraCaptureSession; 
         try { 
          mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, 
            CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); 
          setFlash(mPreviewRequestBuilder); 

          mPreviewRequest = mPreviewRequestBuilder.build(); 
          mCaptureSession.setRepeatingRequest(mPreviewRequest, 
            mCaptureCallback, mBackgroundHandler); 
         } catch (CameraAccessException e) { 
          ... 
         } 
        } 

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

procédé captureStillPicture:

private void captureStillPicture() { 
    try { 
     final CaptureRequest.Builder captureBuilder = 
       mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); 
     captureBuilder.addTarget(mImageReader.getSurface()); 

     captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, 
       CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); 
     setFlash(captureBuilder); 

     CameraCaptureSession.CaptureCallback CaptureCallback 
       = new CameraCaptureSession.CaptureCallback() { 

      @Override 
      public void onCaptureCompleted(@NonNull CameraCaptureSession session, 
              @NonNull CaptureRequest request, 
              @NonNull TotalCaptureResult result) { 
       unlockFocus(); 
      } 
     }; 

     mCaptureSession.stopRepeating(); 
     mCaptureSession.capture(captureBuilder.build(), CaptureCallback, null); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 

méthode unlockFocus:

private void unlockFocus() { 
    try { 
     mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, 
       CameraMetadata.CONTROL_AF_TRIGGER_CANCEL); 
     mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback, 
       mBackgroundHandler); 
     // After this, the camera will go back to the normal state of preview. 
     setFlash(mPreviewRequestBuilder); 
     mState = STATE_PREVIEW; 
     mCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback, 
       mBackgroundHandler); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 

Comment pourrais-je résoudre ce problème?

Merci.

Répondre

0

Vous devez vous assurer que vous appelez

mPreviewRequest = mPreviewRequestBuilder.build(); 
mCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback, 
      mBackgroundHandler); 

ou équivalent après avoir mis à jour le mode flash du constructeur de demande. Le générateur de requêtes crée simplement des demandes - vous devez toujours les envoyer à la caméra une fois que vous avez défini les nouvelles valeurs souhaitées.