évolution - Orientation de la caméra Android




évolution android (2)

Ok, j'ai une classe qui étend SurfaceView et remplace

surfaceChanged - appelle simplement startPreview
surfaceCreated - ouvre la caméra, édite les paramètres *, définit surfaceHolder
surfaceDestroyed - Appelle stopPreview, libère la caméra

Tout cela fonctionne très bien parce que lorsque l'orientation est Portrait:

de surfaceCréé *

m_camera = Camera.open();
Camera.Parameters p = m_camera.getParameters();

if (getResources().getConfiguration().orientation != 
    Configuration.ORIENTATION_LANDSCAPE)
{
    p.set("orientation", "portrait");

    // CameraApi is a wrapper to check for backwards compatibility  
    if (CameraApi.isSetRotationSupported())
    {
         CameraApi.setRotation(p, 90);
    }
}

Cependant, chaque fois que l’orientation change, elle appelle Camera.open () qui, comme vous le savez peut-être, est une opération assez coûteuse, qui rend les transitions moins fluides.

Lorsque je force l'orientation vers le paysage, la prévisualisation est excellente. Create ne peut être appelé qu'une fois, ce qui fonctionne car l'aperçu est en mode paysage, la caméra est toujours ce que l'utilisateur voit. Cependant, j'ai besoin d'un moyen de définir l'orientation de l'image réelle prise en portrait. Lorsque je force le paysage, la surface n'est jamais recréée et les paramètres ne sont jamais définis lorsque la caméra est en mode portrait.

Alors, comment puis-je effectuer l'une des opérations suivantes (exclusivement)?

  1. Accrochez-vous à m_camera entre onDestroy et onCreate lorsque l'orientation change pour que la transition se fasse en douceur

  2. Forcer le paysage et détecter les changements d'orientation d'une autre manière ... faire pivoter la dernière image capturée si elle est conservée en portrait.

Aussi, si je suis hors de la base, est-ce que quelqu'un peut me diriger dans une meilleure direction? Je vous remercie.


Avez-vous envisagé d'utiliser la méthode standard fournie dans la documentation de l'API, que vous pouvez appeler sur surfaceChanged? Vous pouvez stocker les degrés dans une variable globale à utiliser ultérieurement lors de l'enregistrement de l'image. Vous pouvez également faire un simple vérificateur de null sur votre variable d'appareil photo afin de ne pas le créer à nouveau dans SurfaceCreated.

public void setCameraDisplayOrientation() 
{        
     if (mCamera == null)
     {
         Log.d(TAG,"setCameraDisplayOrientation - camera null");
         return;             
     }

     Camera.CameraInfo info = new Camera.CameraInfo();
     Camera.getCameraInfo(CAM_ID, info);

     WindowManager winManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
     int rotation = winManager.getDefaultDisplay().getRotation();

     int degrees = 0;

     switch (rotation) 
     {
         case Surface.ROTATION_0: degrees = 0; break;
         case Surface.ROTATION_90: degrees = 90; break;
         case Surface.ROTATION_180: degrees = 180; break;
         case Surface.ROTATION_270: degrees = 270; break;
     }

     int result;
     if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) 
     {
         result = (info.orientation + degrees) % 360;
         result = (360 - result) % 360;  // compensate the mirror
     } else {  // back-facing
         result = (info.orientation - degrees + 360) % 360;
     }
     mCamera.setDisplayOrientation(result);
}

Comme vous l'avez vu dans les autres réponses, ce code devient très compliqué. Vous pourriez vouloir utiliser une bibliothèque pour vous aider à fournir cette fonctionnalité, par exemple, CWAC-Camera prend en charge OS 2.3 et versions ultérieures (en espérant que vous puissiez supprimer le support OS 2.1 et OS 2.2 maintenant):
https://github.com/commonsguy/cwac-camera

CWAC-Camera prend en charge le verrouillage de l'aperçu de la caméra en paysage et fait pivoter automatiquement les images dans l'orientation de correction pour vous. Parcourez les problèmes du projet si vous souhaitez avoir un aperçu de tous les problèmes spécifiques aux périphériques à résoudre, lesquels sont davantage des raisons d’essayer d’utiliser une bibliothèque au lieu de conserver tout ce code et de vous tester vous-même.





android-camera