Enfrentando el problema de orientación con la cámara capturada en la imagen de teléfonos Android

Estoy utilizando exifInterface para el código de edición de rotación de fotos está abajo: Enfrentando la imagen de la imagen capturada captura de la cámara.

  • Crear un mapa de bits desde el archivo
Bitmap b = BitmapFactory.decodeFile(imagePath); 
  • Cambiar el tamaño del mapa de bits escalándolo al nivel adecuado
 int width = b.getWidth(); int height = b.getHeight(); int newWidth = 150; int newHeight = 150; float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); // Bitmap resizedBitmap = Bitmap.createBitmap(b, 0, 0, width, height, matrix, true); // resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 70, out); 
  • Orientar la orientación de la imagen
  ExifInterface exif = new ExifInterface(imagePath); String orientation = exif.getAttribute(ExifInterface.TAG_ORIENTATION); if (orientation.equals(ExifInterface.ORIENTATION_NORMAL)) { // Do nothing. The original image is fine. } else if (orientation.equals(ExifInterface.ORIENTATION_ROTATE_90+"")) { matrix.postRotate(90); } else if (orientation.equals(ExifInterface.ORIENTATION_ROTATE_180+"")) { matrix.postRotate(180); } else if (orientation.equals(ExifInterface.ORIENTATION_ROTATE_270+"")) { matrix.postRotate(270); } 
  • Guardar el nuevo mapa de bits
  out = new FileOutputStream(new File("some output file path")); Bitmap resizedBitmap = Bitmap.createBitmap(b, 0, 0, width, height, matrix, true); resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 70, out); 

Este código no funciona para resolver el problema de rotación, por favor, dame una pauta. En los dispositivos LG es exifinterface que siempre devuelve la orientación 0, dispositivos Samsung que devuelven 6 y 1.

Cómo solucionar este problema con todos los dispositivos como htc, Motorola, samsung, Sony y LG.

Estoy agradecido a todos por favor, ayúdenme.

Puede utilizar esta función para hacer lo mismo que usted requiere. Tenga esta función en su actividad o en cualquier clase util y llámela para obtener bitmap desde la ruta del archivo.

He estado utilizando esta función en mi aplicación y mis principales dispositivos de prueba son LG.

 public static Bitmap decodeFile(String path) { int orientation; try { if (path == null) { return null; } // decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; // Find the correct scale value. It should be the power of 2. final int REQUIRED_SIZE = 70; int width_tmp = o.outWidth, height_tmp = o.outHeight; int scale = 8; while (true) { if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE) break; width_tmp /= 2; height_tmp /= 2; scale++; } // decode with inSampleSize BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize = scale; Bitmap bm = BitmapFactory.decodeFile(path, o2); Bitmap bitmap = bm; ExifInterface exif = new ExifInterface(path); orientation = exif .getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); Log.e("orientation", "" + orientation); Matrix m = new Matrix(); if ((orientation == 3)) { m.postRotate(180); m.postScale((float) bm.getWidth(), (float) bm.getHeight()); // if(m.preRotate(90)){ Log.e("in orientation", "" + orientation); bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), m, true); return bitmap; } else if (orientation == 6) { m.postRotate(90); Log.e("in orientation", "" + orientation); bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), m, true); return bitmap; } else if (orientation == 8) { m.postRotate(270); Log.e("in orientation", "" + orientation); bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), m, true); return bitmap; } return bitmap; } catch (Exception e) { } return null; } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.