¿Cómo puedo encontrar la orientación de una imagen tomada con Intent MediaStore.ACTION_IMAGE_CAPTURE?

Cuando tomo una foto con la aplicación de cámara Androids, detecta la orientación del teléfono y guarda la imagen en consecuencia. Así que si tomo una foto de un edificio, el techo estará en la parte superior, si sostener el teléfono en posición horizontal o vertical.

Sin embargo, cuando uso

Intención imageCaptureIntent = new Intent (MediaStore.ACTION_IMAGE_CAPTURE);

Para obtener una imagen, la aplicación de cámara no reacciona a la orientación. Si sostengo el teléfono verticalmente (retrato), la imagen resultante se girará, con el techo de dicho edificio a la izquierda de la pantalla.

¿Cómo puedo establecer la intención de modo que la cámara tome en cuenta la orientación?

¿O puedo deducir de alguna manera en qué orientación se tomó la foto y girarla después?

O cualquier otra sugerencia será muy apreciada.

~ Gracias de antemano, saludos cordiales.

Encontré la respuesta. El exif de la imagen tiene un indicador de la orientación. Por si acaso, exif se puede ver en Android como este:

ExifInterface exif = new ExifInterface("filepath"); exif.getAttribute(ExifInterface.TAG_ORIENTATION); 

Leer desde Exif si está disponible, de lo contrario leer en MediaStore

 public static int getImageOrientation(Context context, String imagePath) { int orientation = getOrientationFromExif(imagePath); if(orientation <= 0) { orientation = getOrientationFromMediaStore(context, imagePath); } return orientation; } private static int getOrientationFromExif(String imagePath) { int orientation = -1; try { ExifInterface exif = new ExifInterface(imagePath); int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (exifOrientation) { case ExifInterface.ORIENTATION_ROTATE_270: orientation = 270; break; case ExifInterface.ORIENTATION_ROTATE_180: orientation = 180; break; case ExifInterface.ORIENTATION_ROTATE_90: orientation = 90; break; case ExifInterface.ORIENTATION_NORMAL: orientation = 0; break; default: break; } } catch (IOException e) { Log.e(LOG_TAG, "Unable to get image exif orientation", e); } return orientation; } private static int getOrientationFromMediaStore(Context context, String imagePath) { Uri imageUri = getImageContentUri(context, imagePath); if(imageUri == null) { return -1; } String[] projection = {MediaStore.Images.ImageColumns.ORIENTATION}; Cursor cursor = context.getContentResolver().query(imageUri, projection, null, null, null); int orientation = -1; if (cursor != null && cursor.moveToFirst()) { orientation = cursor.getInt(0); cursor.close(); } return orientation; } private static Uri getImageContentUri(Context context, String imagePath) { String[] projection = new String[] {MediaStore.Images.Media._ID}; String selection = MediaStore.Images.Media.DATA + "=? "; String[] selectionArgs = new String[] {imagePath}; Cursor cursor = context.getContentResolver().query(IMAGE_PROVIDER_URI, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { int imageId = cursor.getInt(0); cursor.close(); return Uri.withAppendedPath(IMAGE_PROVIDER_URI, Integer.toString(imageId)); } if (new File(imagePath).exists()) { ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DATA, imagePath); return context.getContentResolver().insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); } return null; } 

Para una solución rápida puede comprobar si el ancho de la imagen es mayor que la altura de la imagen. Significa que es paisaje y se puede cambiar a retrato.

 private Bitmap fromGallery(final Uri selectedImageUri) { try { Bitmap bm = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImageUri); ExifInterface exif = new ExifInterface(selectedImageUri.getPath()); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); int angle = 0; switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: angle = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: angle = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: angle = 270; break; default: angle = 0; break; } Matrix mat = new Matrix(); if (angle == 0 && bm.getWidth() > bm.getHeight()) mat.postRotate(90); else mat.postRotate(angle); return Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), mat, true); } catch (IOException e) { Log.e("", "-- Error in setting image"); } catch (OutOfMemoryError oom) { Log.e("", "-- OOM Error in setting image"); } return null; } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.