open - Cámara Android en retrato en SurfaceView
open camera android developer (6)
A partir de API lvl 8, esto está disponible:
public final void setDisplayOrientation (int degrees)
es decir, con portait en el manifiesto:
public void surfaceCreated(SurfaceHolder holder) {
mCamera = Camera.open();
mCamera.setDisplayOrientation(90);
Intenté varias cosas para intentar que la vista previa de la cámara se muestre en vertical en un SurfaceView
. Nada funcionó. Estoy probando en un Droid que tiene 2.0.1. Lo intenté:
1) forzar el diseño a ser retratado 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
El enlace que Roman dio sobre el hilo temático tiene una solución factible que estoy usando ahora.
Encuéntrelo aquí: http://code.google.com/p/android/issues/detail?id=1193#c26
No es necesario que establezca ningún parámetro para la orientación hasta que necesite hacerlo explícitamente. 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.
No hay forma de hacerlo en muchos dispositivos actuales, incluidos G1 y Droid. Echa un vistazo al informe de error relevante aquí:
También vea un comentario de uno de los ingenieros de Android (Dave) aquí:
Puedes probar esto (bueno para 2.2 o menos). 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 {
}
}
};
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á retrato.
SurfaceHolder que utiliza para la cámara debe tener un tamaño compatible con la resolución de pantalla del tamaño de vista previa del teléfono.
Funny on 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);