9
votes

Android Camera rotation

J'ai une Motorola Defy OS Android 2.1 et je fais une application avec aperçu de la caméra. Le problème est que la caméra fonctionne bien sur Samsung Galaxy S avec Android 2.1, mais sur Motorola, la caméra est pivotée à 90 degrés. J'ai essayé de faire ceci: xxx

mais ça ne fonctionne pas. Je n'ai pas encore trouvé de solution.


2 commentaires

Réponse présente ici - Stackoverflow.com/Questtions/14066038/...


Ce Réponse peut vous aider


6 Réponses :


16
votes
if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
        camera.setDisplayOrientation(90);
        lp.height = previewSurfaceHeight;
        lp.width = (int) (previewSurfaceHeight / aspect);
    } else {
        camera.setDisplayOrientation(0);
        lp.width = previewSurfaceWidth;
        lp.height = (int) (previewSurfaceWidth / aspect);
    }

5 commentaires

Merci pour votre réponse, mais SetDisPlayorIningOrientation fonctionne uniquement pour Android 2.2 ou 2.3 et mon application est en 2.1. Y a-t-il une autre façon de travailler en 2.1 aussi? Si quelqu'un résolut ce problème, veuillez m'aider.


emm. Je l'ai testé sur 2,1 il fonctionne parfaitement. Je pense que tu veux dire mediarrecord.setdisplayorientation - cela est vraiment soutenu en 2.2 ou plus


Camera.setdisplayorientation est uniquement pris en charge à partir de l'API 8 (2.2) Voir développeur.android.com/reference/andrroid/hardware/...


Quelles sont les variables LP et Aspect?


C'est en 2011. Je ne me souviens pas. aspect, c'est Emploio, LP - LayOutParams



0
votes

Je pense que vous ne pouvez pas faire de paramétrage pour soutenir l'API 2.2 à 2.1. L'API n'a pas dans votre appareil actuel lib. Vous devez passer à 2.2 pour prendre en charge le niveau d'API 8. Au fait, j'essaie également d'utiliser le niveau API 7:

camera.setDisplayOrientation(90);


0 commentaires

2
votes

caméra.setdisPlayLorientation (int) n'existe pas sous 2.1!

Et ce code peut fonctionner, mais échouer dans mon jalon / droïde: ( xxx

Vous pouvez voir plus dans http://code.google.com/p/android/issues/detail?id=1193#C42


1 commentaires

Cela fonctionne fantastique pour moi sur mon Orange San Francisco. Merci :)



2
votes

J'ai trouvé ce code qui fonctionne dans Android 1.6 et plus (fonctionne pour moi en utilisant 2.1 et présentez l'aperçu en mode portrait sans rotation)

public void surfaceCreated(SurfaceHolder holder){
        try{
            camera = Camera.open();
            setDisplayOrientation(camera, 90);
            camera.setPreviewDisplay(holder);
            camera.startPreview();
        }catch(IOException e){
            Log.d("CAMERA", e.getMessage());
        }

}

protected void setDisplayOrientation(Camera camera, int angle){
        Method downPolymorphic;
        try
        {
            downPolymorphic = camera.getClass().getMethod("setDisplayOrientation", new Class[] { int.class });
            if (downPolymorphic != null)
                downPolymorphic.invoke(camera, new Object[] { angle });
        }
        catch (Exception e1)
        {
        }
}


0 commentaires

8
votes

Il y a un code d'exemple officiel pour cela dans l'Android Docs Now (Sous SetDisplayOrientation ()):

public static void setCameraDisplayOrientation(Activity activity,
        int cameraId, android.hardware.Camera camera)
{
    android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
    android.hardware.Camera.getCameraInfo(cameraId, info);
    int rotation = activity.getWindowManager().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;
    }
    camera.setDisplayOrientation(result);
}


3 commentaires

@Fahad Camera ID désigne la caméra arrière ou avant. 0 Pour l'arrière, 1 pour la face avant. Probablement préférable d'utiliser les variables d'instance statique caméra.camerainfo.camera_faCing_back et caméra.camerainfo.camera_faCing_front .


@Timmmm jfyi, caméra.setdisplayorientation ne fait rien sur le Samsung Galaxy Sii.


@Stevenwolfe Essayez caméra.getparameters (). Sétrotation (résultat); après caméra.setdisplayorientation (résultat);



1
votes
public static void setCameraDisplayOrientation(Activity activity,
                                               int cameraId,android.hardware.Camera camera) {
    android.hardware.Camera.CameraInfo info =
            new android.hardware.Camera.CameraInfo();
    android.hardware.Camera.getCameraInfo(cameraId, info);
    int rotation = activity.getWindowManager().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;
    }
    camera.setDisplayOrientation(result);
}

1 commentaires

Cela fonctionne très bien très bien, si le CameraPreview extende une certaine vue, nous devons également inverser les calculs de largeur / hauteur dans la méthode Onlayout.