2017-04-10 2 views
1

Je construis un appareil photo personnalisé avec l'API Camera2. Jusqu'à présent, la caméra fonctionne très bien, sauf pour la prévisualisation qui est parfois déformée. Disons que j'ouvre la caméra 7 fois de suite. Toutes les tentatives sont réussies et la 8ème fois, l'aperçu de la caméra est déformé. On dirait qu'il utilise la largeur comme hauteur et vice versa.Android Camera2 API aperçu parfois déformé

J'ai basé mon code sur l'exemple d'implémentation Google de la camera2 que vous pouvez trouver here. la chose intéressante est que même l'exemple de mise en œuvre de Google a parfois cet aperçu déformé. J'ai essayé de modifier AutoFitTextureView mais rien n'a réussi. J'utilise actuellement le AutoFitTextureView.java Google fournit à nouveau.

Un article similaire à celui-ci can be found here. Cependant, les correctifs proposés n'ont pas résolu le problème.

Je peux reproduire le problème en changeant ce qui suit dans la méthode setUpCameraOutputs:

mTextureView.setAspectRatio(mPreviewSize.getHeight(), mPreviewSize.getWidth()); 

à:

mTextureView.setAspectRatio(mPreviewSize.getWidth(), mPreviewSize.getHeight()); 

Une autre chose étrange est que chaque fois que l'aperçu déformé se produit et vous appuyez simplement sur la maison bouton de sorte que l'application va dans onPause() et ouvrir à nouveau l'application de sorte que onResume() est appelé, l'aperçu est parfait à chaque fois.

Quelqu'un a-t-il rencontré ce problème et trouvé une solution?

Merci à l'avance

+1

Avez-vous trouvé une solution? Je suis également confronté à ce problème. –

+0

Je suis aussi confronté au même problème – FaisalAhmed

Répondre

0

L'échantillon Google Camera2Basic was finally fixed. Le code original avait une minuscule < vs> erreur. Il avait eu tort pendant 2 ans.

0

Je suis confronté au même problème sur Sony Xperia Z3 Tablet Compact.

La demande de traction qu'Alex a fait remarquer ne semble pas fonctionner pour moi. Il en résulte un aperçu de la caméra plus grand que la zone de la vue (l'aperçu est rogné).

Bien que je n'étais pas capable de suivre le problème spécifiquement, j'ai été en mesure de trouver une solution de contournement. Il semble que la distorsion se produise lorsque la taille de mTextureView change pendant l'ouverture de la caméra. Retarder la procédure d'ouverture de la caméra résout le problème.

méthode modifiée de openCamera:

/** 
* Opens the camera specified by {@link StepFragmentCamera#mCameraId}. 
*/ 
private void openCamera(int width, int height) { 
    startBackgroundThread(); 

    if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA) 
      != PackageManager.PERMISSION_GRANTED) { 
     requestCameraPermission(); 
     return; 
    } 
    setUpCameraOutputs(width, height); 
    configureTransform(width, height); 

    /* 
    * Delay the opening of the camera until (hopefully) layout has been fully settled. 
    * Otherwise there is a chance the preview will be distorted (tested on Sony Xperia Z3 Tablet Compact). 
    */ 
    mTextureView.post(new Runnable() { 
     @Override 
     public void run() { 
      /* 
      * Carry out the camera opening in a background thread so it does not cause lag 
      * to any potential running animation. 
      */ 
      mBackgroundHandler.post(new Runnable() { 
       @Override 
       public void run() { 
        Activity activity = getActivity(); 
        CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE); 
        try { 
         if (!mCameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) { 
          throw new RuntimeException("Time out waiting to lock camera opening."); 
         } 
         manager.openCamera(mCameraId, mStateCallback, mBackgroundHandler); 
        } catch (CameraAccessException e) { 
         e.printStackTrace(); 
        } catch (InterruptedException e) { 
         throw new RuntimeException("Interrupted while trying to lock camera opening.", e); 
        } 
       } 
      }); 
     } 
    }); 
}