2015-02-11 12 views
7

Desidero scoprire la rotazione EXIF ​​di un'immagine. Quando l'immagine viene visualizzata nella galleria, non viene ruotata, ma dopo aver caricato l'immagine con le informazioni EXIF ​​'ruota a sinistra' l'immagine viene visualizzata ruotata.Android: ottieni la rotazione EXIF ​​dall'URI

Ora voglio chiedere all'utente se vuole usare l'immagine ruotata o l'originale.

ottengo un Uri a tale metodo e memorizzarlo una in bitmap

InputStream inputStream = PaintroidApplication.applicationContext.getContentResolver().openInputStream(bitmapUri); 
    BitmapFactory.decodeStream(inputStream, null, options); 
    inputStream.close(); 

Ora voglio utilizzare l'ExifInterface di determinare la rotazione, ma ExifInterface richiede un percorso:

 ExifInterface exif = new ExifInterface(bitmapUri.getPath()); 
     rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); 

Ora ho un problema con il percorso e logcat mostra il seguente messaggio:

E/JHEAD: impossibile aprire '/ documento/immagine: 15035'

Come posso risolvere questo problema o esiste un'altra soluzione per scoprire le informazioni EXIF?

+0

Sto indovinando che si sta utilizzando un selettore (REQUEST_IMAGE_PICK) per identificare il percorso all'immagine? – Neil

+0

Ho trovato una domanda simile qui http://stackoverflow.com/questions/19834842/android-gallery-on-kitkat-returns-different-uri-for-intent-action-get-content – Neil

risposta

1

Il problema riguarda le autorizzazioni. Aggiungi il permesso android.permission.READ_EXTERNAL_STORAGE al tuo manifest.

6

Ho riscontrato lo stesso problema. I raccoglitori forniti dall'API in V19 e versioni successive potrebbero fornire questo risultato. Dare il codice sotto una prova, dovrebbe risolvere il tuo problema.


tuo codice modificato

String path = FileUtility.getRealPathFromURI(context, Uri.parse(bitmapUri.getPath()); 
ExifInterface exif = new ExifInterface(path); 
rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); 

FileUtility.java

/** 
* Gets the real path from file 
* @param context 
* @param contentUri 
* @return path 
*/ 
public static String getRealPathFromURI(Context context, Uri contentUri) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     return getPathForV19AndUp(context, contentUri); 
    } else { 
     return getPathForPreV19(context, contentUri); 
    } 
} 

/** 
* Handles pre V19 uri's 
* @param context 
* @param contentUri 
* @return 
*/ 
public static String getPathForPreV19(Context context, Uri contentUri) { 
    String res = null; 

    String[] proj = { MediaStore.Images.Media.DATA }; 
    Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null); 
    if(cursor.moveToFirst()){; 
     int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     res = cursor.getString(column_index); 
    } 
    cursor.close(); 

    return res; 
} 

/** 
* Handles V19 and up uri's 
* @param context 
* @param contentUri 
* @return path 
*/ 
@TargetApi(Build.VERSION_CODES.KITKAT) 
public static String getPathForV19AndUp(Context context, Uri contentUri) { 
    String wholeID = DocumentsContract.getDocumentId(contentUri); 

    // Split at colon, use second item in the array 
    String id = wholeID.split(":")[1]; 
    String[] column = { MediaStore.Images.Media.DATA }; 

    // where id is equal to 
    String sel = MediaStore.Images.Media._ID + "=?"; 
    Cursor cursor = context.getContentResolver(). 
      query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
        column, sel, new String[]{ id }, null); 

    String filePath = ""; 
    int columnIndex = cursor.getColumnIndex(column[0]); 
    if (cursor.moveToFirst()) { 
     filePath = cursor.getString(columnIndex); 
    } 

    cursor.close(); 
    return filePath; 
} 
+1

questo codice funziona quasi per me . Grazie. una cosa da aggiungere è DocumentsContract.getDocumentId (contentUri) funziona solo se DocumentContract.isDocumentUri restituisce true. così sono andato con se è> = 19 e isDocumentUri quindi utilizzare getPathForV19AndUp. altrimenti usa getPathForPreV19. – RyanShao

Problemi correlati