2012-09-25 24 views
6

Estoy probando mi aplicación en HTC Desire con Android 2.2. y funciona exactamente como me gustaría. Yo uso paquetes de Sherlock para tener el mismo estilo en dispositivos más antiguos que en los más nuevos.¿Cómo lidiar con dispositivos Android que no respetan los datos de orientación EXIF?

Mi AVD está configurado para usar el último Android, y también se ve bien. Luego lo coloqué en el Samsung Galaxy S2, y mientras trabajo con las imágenes de la cámara y la galería, se rotan incorrectamente. Parece que algo en Samsung (la aplicación de la cámara, Android en sí mismo) no lo hace o no comprueba EXIF ​​y mis imágenes están orientadas incorrectamente. Las imágenes de retrato se cargan en horizontal y las de paisaje se cargan en vertical.

  1. Supongo que necesito verificar EXIF ​​de alguna manera e ignorarlo para poder cargar las imágenes como están?
  2. El problema más grande es - ¿cómo saber si hay algún otro dispositivo (algunos HTC, algunos HUAWEI alguno) que pueda causar un problema similar? Pensé que todos los dispositivos Android se comportan de la misma manera además de tener 4 grupos de tamaño de pantalla ...

Tnx.

Respuesta

4

Sin código es difícil saber qué está pasando.

La manera más sencilla que he encontrado es leer la información EXIF ​​y comprobar si la imagen necesita rotación. Para leer más sobre la clase ExifInterface en Android: http://developer.android.com/intl/es/reference/android/media/ExifInterface.html

Dicho esto, aquí hay un código de ejemplo:

/** An URI and a imageView */ 
public void setBitmap(ImageView mImageView, String imageURI){ 
    // Get the original bitmap dimensions 
    BitmapFactory.Options options = new BitmapFactory.Options();    
    Bitmap bitmap = BitmapFactory.decodeFile(imageURI, options); 
    float rotation = rotationForImage(getActivity(), Uri.fromFile(new File(imageURI))); 

    if(rotation!=0){ 
     //New rotation matrix 
     Matrix matrix = new Matrix(); 
     matrix.preRotate(rotation); 
     mImageView.setImageBitmap(Bitmap.createBitmap(bitmap, 0, 0, reqHeight, reqWidth, matrix, true)); 
    } else { 
     //No need to rotate 
     mImageView.setImageBitmap(BitmapFactory.decodeFile(imageURI, options)); 
    } 
} 


/** Returns how much we have to rotate */ 
public static float rotationForImage(Context context, Uri uri) { 
     try{ 
      if (uri.getScheme().equals("content")) { 
       //From the media gallery 
       String[] projection = { Images.ImageColumns.ORIENTATION }; 
       Cursor c = context.getContentResolver().query(uri, projection, null, null, null); 
        if (c.moveToFirst()) { 
         return c.getInt(0); 
        }    
      } else if (uri.getScheme().equals("file")) { 
       //From a file saved by the camera 
        ExifInterface exif = new ExifInterface(uri.getPath()); 
        int rotation = (int) exifOrientationToDegrees(exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL)); 
        return rotation; 
      } 
      return 0; 

     } catch (IOException e) { 
      Log.e(TAG, "Error checking exif", e); 
      return 0; 
     } 
} 

/** Get rotation in degrees */ 
private static float exifOrientationToDegrees(int exifOrientation) { 
     if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) { 
      return 90; 
     } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) { 
      return 180; 
     } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) { 
      return 270; 
     } 
     return 0; 
} 

Si hay un error, verá el registro de "Comprobación de errores EXIF" en función de rotationForImage.

+4

La respuesta es buena para explicar cómo verificar los datos de orientación ExifInterface, pero esa no parece ser la pregunta original. '¿Cómo manejas los dispositivos que no registran correctamente el campo de orientación?' parece ser el principio de la pregunta. Esta respuesta solo explica cómo obtener el campo de orientación de ExifInterface que se explica explícitamente en los documentos de android. –

+0

No funciona para mí. –

Cuestiones relacionadas