Obtener la rotación de ExifInterface siempre devuelve 0

Estoy pasando un mapa de bits a través de un paquete onActivityResult de una cámara.

 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.TITLE, "picture"); mCapturedImageURI = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); intent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI); startActivityForResult(intent, REQUEST_TAKE_PHOTO); 

Puedo obtener el mapa de bits:

 Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), mCapturedImageURI); 

Sin embargo, he notado que la imagen se gira en algunos dispositivos. Después de buscar puestos aquí, la solución típica parecía conseguir la rotación a través de:

 String path = mCapturedImageURI.getPath(); ExifInterface exif = new ExifInterface(path); int rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); 

Desafortunadamente, mi int rotation siempre es 0 aunque el mapa de bits se rota.

También he intentado esto que trabajó cuando he subido una imagen ya en el dispositivo, pero la orientación sigue siendo 0:

 String[] orientationColumn = {MediaStore.Images.Media.ORIENTATION}; Cursor cur = managedQuery(mCapturedImageURI, orientationColumn, null, null, null); if (cur != null && cur.moveToFirst()) { orientation = cur.getInt(cur.getColumnIndex(orientationColumn[0])); } 

¿Alguien ve algo que pueda estar haciendo mal aquí? ¿O otra solución?

Generalmente, el mapa de bits se gira 90 grados en sentido antihorario con la cámara trasera y 90 grados en el sentido de las agujas del reloj con la cámara frontal. Funciona bien en Moto G. Rotated en Galaxy S3 y LG G2.

Intente utilizar la información en el cursor de contenido.

 float photoRotation = 0; boolean hasRotation = false; String[] projection = { Images.ImageColumns.ORIENTATION }; try { Cursor cursor = getActivity().getContentResolver().query(photoUri, projection, null, null, null); if (cursor.moveToFirst()) { photoRotation = cursor.getInt(0); hasRotation = true; } cursor.close(); } catch (Exception e) {} if (!hasRotation) { ExifInterface exif = new ExifInterface(photoUri.getPath()); int exifRotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED); switch (exifRotation) { case ExifInterface.ORIENTATION_ROTATE_90: { photoRotation = 90.0f; break; } case ExifInterface.ORIENTATION_ROTATE_180: { photoRotation = 180.0f; break; } case ExifInterface.ORIENTATION_ROTATE_270: { photoRotation = 270.0f; break; } } } 

Pruebe de esta manera, espero que esto le ayudará a resolver su problema.

Activity_main.xml:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:gravity="center"> <ImageView android:id="@+id/imgFromCameraOrGallery" android:layout_width="wrap_content" android:layout_height="wrap_content" android:adjustViewBounds="true" android:src="@drawable/ic_launcher"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/btnCamera" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="Camera"/> <Button android:id="@+id/btnGallery" android:layout_width="0dp" android:layout_weight="1" android:layout_marginLeft="5dp" android:layout_height="wrap_content" android:text="Gallery"/> </LinearLayout> </LinearLayout> 

MainActivity.java:

 public class MainActivity extends Activity { private ImageView imgFromCameraOrGallery; private Button btnCamera; private Button btnGallery; private String imgPath; final private int PICK_IMAGE = 1; final private int CAPTURE_IMAGE = 2; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imgFromCameraOrGallery = (ImageView) findViewById(R.id.imgFromCameraOrGallery); btnCamera = (Button) findViewById(R.id.btnCamera); btnGallery = (Button) findViewById(R.id.btnGallery); btnCamera.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, setImageUri()); startActivityForResult(intent, CAPTURE_IMAGE); } }); btnGallery.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, ""), PICK_IMAGE); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { if (requestCode == CAPTURE_IMAGE) { rotateImage(getImagePath()); } else if (requestCode == PICK_IMAGE) { imgFromCameraOrGallery.setImageBitmap(BitmapFactory.decodeFile(getAbsolutePath(data.getData()))); } } } private void rotateImage(final String path) { runOnUiThread(new Runnable() { @Override public void run() { Bitmap b = decodeFileFromPath(path); try { ExifInterface ei = new ExifInterface(path); int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); Matrix matrix = new Matrix(); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: matrix.postRotate(90); b = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), matrix, true); break; case ExifInterface.ORIENTATION_ROTATE_180: matrix.postRotate(180); b = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), matrix, true); break; case ExifInterface.ORIENTATION_ROTATE_270: matrix.postRotate(270); b = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), matrix, true); break; default: b = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), matrix, true); break; } } catch (Throwable e) { e.printStackTrace(); } FileOutputStream out1 = null; File file; try { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { file = new File(Environment.getExternalStorageDirectory() + "/DCIM/", "image" + new Date().getTime() + ".jpg"); } else { file = new File(getFilesDir() , "image" + new Date().getTime() + ".jpg"); } out1 = new FileOutputStream(file); b.compress(Bitmap.CompressFormat.JPEG, 90, out1); imgFromCameraOrGallery.setImageBitmap(BitmapFactory.decodeFile(file.getAbsolutePath())); } catch (Exception e) { e.printStackTrace(); } finally { try { out1.close(); } catch (Throwable ignore) { } } } }); } private Bitmap decodeFileFromPath(String path){ Uri uri = getImageUri(path); InputStream in = null; try { in = getContentResolver().openInputStream(uri); //Decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; BitmapFactory.decodeStream(in, null, o); in.close(); int scale = 1; int inSampleSize = 1024; if (o.outHeight > inSampleSize || o.outWidth > inSampleSize) { scale = (int) Math.pow(2, (int) Math.round(Math.log(inSampleSize / (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5))); } BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize = scale; in = getContentResolver().openInputStream(uri); Bitmap b = BitmapFactory.decodeStream(in, null, o2); in.close(); return b; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } public String getAbsolutePath(Uri uri) { if(Build.VERSION.SDK_INT >= 19){ String id = uri.getLastPathSegment().split(":")[1]; final String[] imageColumns = {MediaStore.Images.Media.DATA }; final String imageOrderBy = null; Uri tempUri = getUri(); Cursor imageCursor = getContentResolver().query(tempUri, imageColumns, MediaStore.Images.Media._ID + "="+id, null, imageOrderBy); if (imageCursor.moveToFirst()) { return imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA)); }else{ return null; } }else{ String[] projection = { MediaStore.MediaColumns.DATA }; Cursor cursor = getContentResolver().query(uri, projection, null, null, null); if (cursor != null) { int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } else return null; } } private Uri getUri() { String state = Environment.getExternalStorageState(); if(!state.equalsIgnoreCase(Environment.MEDIA_MOUNTED)) return MediaStore.Images.Media.INTERNAL_CONTENT_URI; return MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } private Uri getImageUri(String path) { return Uri.fromFile(new File(path)); } public Uri setImageUri() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { File file = new File(Environment.getExternalStorageDirectory() + "/DCIM/", "image" + new Date().getTime() + ".jpg"); Uri imgUri = Uri.fromFile(file); this.imgPath = file.getAbsolutePath(); return imgUri; } else { File file = new File(getFilesDir() , "image" + new Date().getTime() + ".jpg"); Uri imgUri = Uri.fromFile(file); this.imgPath = file.getAbsolutePath(); return imgUri; } } public String getImagePath() { return imgPath; } } 
  • ¿Cómo dibujo texto en negrita en un mapa de bits?
  • Cómo dibujar una porción de mapa de bits a través de lienzo DrawBitmap
  • ¿Por qué dibujar bitmaps es muy lento en algunos teléfonos Android 2.2?
  • Tratando de dibujar en un mapa de bits cargado por el usuario
  • trabajar con imágenes grandes en android
  • Android, Blur Bitmap al instante?
  • PorterduffXfermode: borra una sección de un mapa de bits
  • Bitmap comprimido con calidad = 100 tamaño de archivo mayor que original
  • Guardar hardware acelerado android lienzo como mapa de bits
  • SetImageViewBitmap no funciona en el widget android
  • Convertir mapa de bits a Mat después de capturar la imagen con la cámara de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.