Problema de orientación de la imagen de Android con actividad de cámara personalizada
Escribí una actividad personalizada de la cámara para manejar algunos problemas que he tenido con ciertos dispositivos Android al llamar a la captura de imágenes con intención. El usuario puede seleccionar Guardar imagen o simplemente usar los datos devueltos desde elOnPictureTakenCallback
.
El problema que tengo es mostrar la imagen correctamente con respecto a la orientación que se tomó. Obligo a que la actividad se muestre en retrato llamandoSetRequestedOrientation
.
¿Cómo sabría la orientación correcta en la que estaba la cámara cuando el usuario tomó la foto? es decir, el usuario podría tomar la imagen en una rotación de 90 (retrato).
He tratado de usar elgetRotation()
en la pantalla predeterminada del administrador de ventanas, pero con la configuración de la orientación solicitada a vertical, que solo devuelveSurface.ROTATION_0
.
Actualización: para aclarar mi otro problema, ¿cómo podría determinar la orientación solo desde elbyte[]
¿Datos en la devolución de llamada de la imagen si el usuario no guardara la imagen?
Actualización: Después de intentar las respuestas a continuación con este código, todo lo que obtengo es ExifInterface.ORIENTATION_NORMAL. También cambié mi código para simplemente guardar el archivo devuelto por la cámara, ya que no estoy seguro de que haya una manera fácil de determinar la orientación con solo tener labyte[]
datos.
private PictureCallback mPicture = new PictureCallback()
{
@Override
public void onPictureTaken(byte[] data, Camera camera)
{
File directory = new File(android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_PICTURES),
"MyApp");
if(!directory.exists())
{
if(!directory.mkdirs())
{
Log.d("CAMERA", "Unable to create directory to save photos.");
return;
}
}
File file = new File(directory.getPath() + file.separator + "IMG_" + SimpleDateFormat.getDateTimeInstance().toString() + ".jpg");
FileOutputStream fos = new FileOutputStream(file);
fos.write(data);
fos.close();
ExifInterface exif = new ExifInterface(file.getCanonicalPath());
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
int rotate = 0;
switch (orientation)
{
case ExifInterface.ORIENTATION_ROTATE_90:
rotate = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotate = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
rotate = 270;
break;
case default:
break;
}
}
};