2012-09-25 14 views
6

Sto testando la mia app su HTC Desire con Android 2.2. e funziona esattamente come mi piacerebbe. Uso i pacchetti Sherlock per avere lo stesso stile sui dispositivi più vecchi come su quelli più recenti.Come gestire i dispositivi Android che non rispettano i dati di orientamento EXIF?

Il mio AVD è impostato per utilizzare l'ultimo android, e sembra anche ok. Poi l'ho posizionato su Samsung Galaxy S2 e, mentre lavoro con le immagini di fotocamera e galleria, vengono ruotati in modo errato. Sembra che qualcosa su Samsung (camera app, Android se stesso) non fa o controlla EXIF ​​e le mie immagini sono orientate male. Le immagini verticali vengono caricate in orizzontale e le immagini orizzontali vengono caricate in verticale.

  1. Immagino di dover controllare EXIF ​​in qualche modo e ignorarlo per caricare le immagini così come sono?
  2. Il problema più grande è - come sapere se ci sono altri dispositivi (alcuni HTC, alcuni HUAWEI in qualche modo) che faranno un problema simile? Ho pensato che tutti i dispositivi Android si comportassero allo stesso modo oltre ad avere 4 gruppi di dimensioni dello schermo ...

Tnx.

risposta

4

Senza alcun codice è difficile dire cosa sta succedendo.

Il modo più semplice che ho trovato è quello di leggere le informazioni EXIF ​​e verificare se l'immagine ha bisogno di rotazione. Per saperne di più sulla classe ExifInterface su Android: http://developer.android.com/intl/es/reference/android/media/ExifInterface.html

Detto questo, ecco qualche esempio di codice:

/** 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; 
} 

Se c'è un errore verrà visualizzato il registro "Errore controllo EXIF" in funzione rotationForImage.

+4

La risposta è utile per spiegare come controllare i dati di orientamento di ExifInterface, ma non sembra essere la domanda originale. "Come gestisci i dispositivi che non registrano correttamente il campo di orientamento?" sembra essere il succo della domanda. Questa risposta spiega solo come ottenere il campo di orientamento da ExifInterface che è esplicitamente spiegato nei documenti di Android. –

+0

Non funziona per me. –

Problemi correlati