2010-03-30 17 views
36

Intenté varias cosas para intentar que la vista previa de la cámara se muestre en retrato en un SurfaceView. Nada funcionó. Estoy probando en un Droid que tiene 2.0.1. Probé:Cámara Android en retrato en SurfaceView

1) obligando a la disposición para ser el retrato por: this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

2) usando

Camera.Parameters parameters = camera.getParameters(); 
parameters.set("orientation", "portrait"); 
parameters.setRotation(90); 
camera.setParameters(parameters); 

¿Hay algo más que pueda probar? Si esto es un error en Android o en el teléfono, ¿cómo puedo asegurarme de que este sea el caso para que tenga pruebas para informar al cliente?

Gracias, Prasanna

+0

Tener una mirada - http://stackoverflow.com/questions/10259299/force-a-camera-to-always-open-in-portrait-mode-in-android/10259572#10259572 –

+0

puede cualquier una ayuda http://stackoverflow.com/questions/28379130/how-to-set-camera-image-orientation –

Respuesta

10

tengo una solución de trabajo para el modo retrato que trabaja en 2.1 (probado en Desire) quizás menos.

La orientación de la pantalla de actividad está configurada en vertical. (android: screenOrientation = "retrato")

los parámetros de la cámara:

Camera.Parameters p = mCamera.getParameters();

p.set("jpeg-quality", 100); 
p.set("orientation", "landscape"); 
p.set("rotation", 90); 
p.setPictureFormat(PixelFormat.JPEG); 
p.setPreviewSize(h, w);// here w h are reversed 
mCamera.setParameters(p); 

y la imagen será vertical.

SurfaceHolder que utiliza para la cámara debe tener un tamaño compatible con el tamaño de vista previa del teléfono generalmente la resolución de pantalla.

divertido en Desire 2.2 no funciona ... Aquí está la solución:

At surfaceCreated(..) or when you have this line 
camera = Camera.open(); 
     add 
camera.setDisplayOrientation(90);//only 2.2> 

Camera.Parameters p = camera.getParameters(); 
    p.set("jpeg-quality", 100); 
p.setRotation(90); 
p.setPictureFormat(PixelFormat.JPEG); 
p.setPreviewSize(h, w); 
camera.setParameters(p); 
0

No hay necesidad de que es necesario establecer los parámetros para la orientación hasta que tenga que hacerlo de forma explícita. Por defecto, es compatible con esta instalación. En mi caso, tengo una actividad y encima de esa actividad tengo una vista de cámara, así que no establecí ninguna orientación para las propiedades de la cámara, en cambio para la actividad configuré la orientación como retrato en el archivo de Manifiesto. ahora la aplicación se ve y funciona bien. Podría ser útil para alguien ...

Gracias.

61

A partir del API lvl 8, está disponible:

pública setDisplayOrientation última vacío (grados int)

es decir, con el portait en el manifiesto:

public void surfaceCreated(SurfaceHolder holder) { 
    mCamera = Camera.open(); 
    mCamera.setDisplayOrientation(90); 
+12

He hecho esto pero el byte [] me estoy poniendo todavía me da una foto de paisaje. – tasomaniac

+3

Establecer mCamera.setDisplayOrientation (90); vista de la cámara Ok, pero el resultado del video no es la misma Vista de cámara, no la rotación 90. ¿por qué? – mum

+0

Oye, puedes usar el método param.setRotation (..) para esto. Todavía estoy tratando de descubrir cómo funciona. ¡Es impresionante! – sunlover3

10

Usted puede probar esto (bueno para 2.2 o inferior). Aquí giro la imagen antes de guardarla en la tarjeta sd. Pero es solo para el modo vertical. Si tenía que hacerlo para ambos modos, debería verificar la orientación de la cámara y verificar antes de capturar la imagen.

PictureCallback jpegCallback = new PictureCallback() { 
    public void onPictureTaken(byte[] data, Camera camera) { 
     FileOutputStream outStream = null; 
     try { 
     imageFilePath = getFilename(); 
     InputStream is = new ByteArrayInputStream(data); 
     Bitmap bmp = BitmapFactory.decodeStream(is); 
     // Getting width & height of the given image. 
     if (bmp != null){ 
      int w = bmp.getWidth(); 
      int h = bmp.getHeight(); 
      // Setting post rotate to 90 
      Matrix mtx = new Matrix(); 
      mtx.postRotate(90); 
      // Rotating Bitmap 
      Bitmap rotatedBMP = Bitmap.createBitmap(bmp, 0, 0, w, h, mtx, true); 
      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
      rotatedBMP.compress(Bitmap.CompressFormat.PNG, 100, stream); 
      byte[] byteArray = stream.toByteArray(); 
      outStream = new FileOutputStream 
           (String.format(imageFilePath,System.currentTimeMillis())); 
      outStream.write(byteArray); 
      outStream.close(); 
     } else { 
      outStream = new FileOutputStream 
           (String.format(imageFilePath,System.currentTimeMillis())); 
      outStream.write(data); 
      outStream.close();   
     }  

     preview.camera.startPreview(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
    } 
    } 
}; 
+1

Este código es para rotar la imagen, no la vista previa como se le pidió. –

Cuestiones relacionadas