Android: la vista previa de la cámara está de lado

Resuelto Donal Rafferty asked hace 54 años • 8 respuestas

Estoy usando una vista previa para mostrar lo que ve la cámara en la pantalla.

Puedo hacer que todo funcione bien, se crea la superficie, se configura la superficie y se muestra la superficie.

Sin embargo, siempre muestra la imagen en un ángulo incorrecto de 90 grados en modo vertical.

Como en la imagen:

texto alternativo

Soy consciente de que el uso del siguiente código aclarará las cosas:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Sin embargo, tengo la Vista previa dentro de una Actividad que tiene otros elementos y no tiene sentido que mi Actividad se muestre en modo horizontal. (Está deshabilitado por defecto)

Entonces me preguntaba si hay alguna forma de cambiar simplemente la orientación de la Vista previa. ¿Y dejar el resto de mi Actividad mostrada correctamente en modo Retrato?

¿O de todos modos rotar la vista previa para que se muestre correctamente?

Donal Rafferty avatar Jan 01 '70 08:01 Donal Rafferty
Aceptado

Este problema pareció comenzar como un error con cierto hardware, consulte aquí , pero se puede solucionar utilizando la llamada a mCamera.setDisplayOrientation(grados) disponible en API 8. Así es como lo implemento:

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);    
    }
}

Esto fue en un HTC Desire y inicialmente tuve que ingresar declaraciones de registro en cada una de las verificaciones de rotación para decir cuál era la rotación y luego depurar en el dispositivo y observar la salida de logCat mientras giraba el dispositivo. Para el HTC Desire, 0 era el teléfono como era de esperar (vertical), 90 grados era girar el teléfono 90 grados EN EL SENTIDO CONTRARIO A LAS HORARIOS (había asumido que habría sido en el sentido de las agujas del reloj). En el código verás que no necesitaba girar la pantalla cuando el teléfono estaba a 90 o 180 grados; el dispositivo parecía manejar esto por sí solo. Solo un punto no funciona correctamente: la rotación de 270 grados se produce cuando gira el dispositivo 90 grados en el sentido de las agujas del reloj y la rotación de la pantalla cuenta bien, pero si gira el dispositivo 270 grados en el sentido contrario a las agujas del reloj, no parece compensarlo correctamente.

PD: Tenga en cuenta el intercambio de ancho y alto en las rotaciones apropiadas.

John J Smith avatar Feb 24 '2011 20:02 John J Smith
 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();
     }
}

prueba este código

jitendra G2 avatar Jan 24 '2013 10:01 jitendra G2