Question

J'utilise un aperçu pour afficher ce que la caméra voir est à l'écran.

Je peux obtenir tout va bien, la surface de travail créé, ensemble de surface et la surface est affichée.

Cependant, il affiche toujours l'image à un incorrect angle de 90 degrés en mode portrait.

Comme dans l'image:

text alt

Je suis conscient du fait que utilisant le code suivant définir l'image droite:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Cependant, j'ai l'aperçu dans une activité qui a d'autres éléments et il n'a pas de sens pour mon activité à afficher en mode paysage. (Son désactivé par défaut)

Alors je me demandais est là de toute façon juste changer l'orientation de l'aperçu? Et laisser le reste de mon activité affichée correctement en mode Portrait?

Ou en tout cas pour faire pivoter l'aperçu afin qu'il soit affiché correctement?

Était-ce utile?

La solution

Cette question semble commencer comme un bug avec certains matériels voir ici mais peut être surmonté en utilisant l'appel à mCamera.setDisplayOrientation (degrés) disponible dans l'API 8. donc, voici comment je le mettre en œuvre:

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {            
    if (isPreviewRunning) {
        mCamera.stopPreview();
    }

    Parameters parameters = mCamera.getParameters();
    Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

    if(display.getRotation() == Surface.ROTATION_0) {
        parameters.setPreviewSize(height, width);                           
        mCamera.setDisplayOrientation(90);
    }

    if(display.getRotation() == Surface.ROTATION_90) {
        parameters.setPreviewSize(width, height);                           
    }

    if(display.getRotation() == Surface.ROTATION_180) {
        parameters.setPreviewSize(height, width);               
    }

    if(display.getRotation() == Surface.ROTATION_270) {
        parameters.setPreviewSize(width, height);
        mCamera.setDisplayOrientation(180);
    }

    mCamera.setParameters(parameters);
    previewCamera();                      
}

And the previewCamera method :

public void previewCamera() {        
    try {           
        mCamera.setPreviewDisplay(mSurfaceHolder);          
        mCamera.startPreview();
        isPreviewRunning = true;
    } catch(Exception e) {
        Log.d(APP_CLASS, "Cannot start preview", e);    
    }
}

C'était sur un HTC Desire et je devais d'abord mettre dans les états se connecter à chacun des contrôles de rotation pour dire ce que la rotation était et déboguée sur l'appareil et a regardé la sortie logcat pendant que j'ai tourné l'appareil. Pour le HTC Desire, 0 était le téléphone que vous attendiez (portrait), 90 degrés tournait le téléphone 90 degrés ANTIHORAIRE (je l'avais supposé qu'il aurait été dans le sens horaire). Dans le code, vous verrez que je ne l'ai pas besoin de faire une rotation de l'écran lorsque le téléphone était à 90 ou 180 degrés - l'appareil semblait gérer lui-même cela. Un seul point ne fonctionne pas correctement: La rotation de 270 degrés est lorsque vous mettez l'appareil à 90 degrés dans le sens horaire et les compteurs de rotation d'affichage ok mais si vous faites pivoter le dispositif 270 degrés dans le sens antihoraire, il ne semble pas compenser correctement <. / p>

P.S. Notez la swapover de largeur et la hauteur dans les rotations appropriées.

Autres conseils

essayer de définir l'orientation de l'écran. Il résout mon problème.

 mCamera.setDisplayOrientation(90);
 public void surfaceCreated(SurfaceHolder holder) {
     mCamera = Camera.open();
     mCamera.setDisplayOrientation(90);
     try {
         mCamera.setPreviewDisplay(holder);
         mCamera.setPreviewCallback(new PreviewCallback() {

             @Override
             public void onPreviewFrame(byte[] data, Camera camera) {
             }
         });

     } catch (Exception e) {
         e.printStackTrace();
     }
}

essayez ce code

J'avais un problème avec caméra avant (Upside question vers le bas). Ensuite, je la méthode suivante documentée dans Android Docs -

public void setCameraDisplayOrientation(Activity activity , int icameraId , Camera camera1s)
    {
        CameraInfo cameraInfo = new CameraInfo();

        Camera.getCameraInfo(icameraId, cameraInfo);

        int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();

        int degrees = 0; // k

        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 (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT)
        {
            // cameraType=CAMERATYPE.FRONT;

            result = (cameraInfo.orientation + degrees) % 360;
            result = (360 - result) % 360; // compensate the mirror

        }
        else
        { // back-facing

            result = (cameraInfo.orientation - degrees + 360) % 360;

        }
        // displayRotate=result;
        camera.setDisplayOrientation(result);


    }

Je l'ai fait prendre des conseils de mCamera.setDisplayOrientation (90); mais aussi tourné le bitmap parce que, pour une raison quelconque, les autres approches de travail ne marche pas pour moi dans la version 2.3.3.

Pour tourner le bitmap je l'ai fait ceci:

Matrix matrix = new Matrix();
matrix.postRotate(90);
imageView1 = new ImageView(this);
Bitmap bitmap = BitmapFactory.decodeFile(files[i].getAbsolutePath());
Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
Bitmap scaledBitmap = Bitmap.createScaledBitmap(rotatedBitmap, 80, 80, true);
imageView1.setImageBitmap(scaledBitmap);

J'ai comparé mon code à celui tutoriel et ce qui a finalement fixé il a été de mettre le code suivant dans mon AndroidManifext.xml: Dans la balise <activity>:

android:screenOrientation="landscape"
android:configChanges="keyboardHidden|orientation">
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
    // If your preview can change or rotate, take care of those events here.
    // Make sure to stop the preview before resizing or reformatting it.

    if (mHolder.getSurface() == null) {
        // preview surface does not exist
        return;
    }

    try {
        mCamera.stopPreview();
    } catch (Exception e) {
        e.printStackTrace();
    }

    Camera.Parameters parameters = mCamera.getParameters();
    Display display = ((WindowManager) getContext().getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

    if (display.getRotation() == Surface.ROTATION_0) {
        parameters.setPreviewSize(h, w);
        mCamera.setDisplayOrientation(90);
    }

    if (display.getRotation() == Surface.ROTATION_90) {
        parameters.setPreviewSize(w, h);
        mCamera.setDisplayOrientation(0);
    }

    if (display.getRotation() == Surface.ROTATION_180) {
        parameters.setPreviewSize(h, w);
        mCamera.setDisplayOrientation(270);
    }

    if (display.getRotation() == Surface.ROTATION_270) {
        parameters.setPreviewSize(w, h);
        mCamera.setDisplayOrientation(180);
    }

    previewCamera();
}

public void previewCamera() {
    try {
        mCamera.setPreviewDisplay(mHolder);
        mCamera.startPreview();
    } catch (Exception e) {
        //Log.d(APP_CLASS, "Cannot start preview", e);
        e.printStackTrace();
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top