2015-02-11 104 views
7

我想找出圖片的EXIF旋轉。當圖片顯示在圖庫中時,圖片不會旋轉,但在使用EXIF信息「向左旋轉」加載圖像後,圖片顯示爲旋轉。Android:從URI獲取EXIF旋轉

現在我想問問用戶,如果他想使用旋轉的圖像或原件。

我得到一個開放的,以該方法,它的存儲位圖

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

現在我想用ExifInterface來確定的旋轉,但ExifInterface需要一個路徑:

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

現在我有一個問題,路徑和logcat顯示以下消息:

E/JHEAD:無法打開'/ document/image:15035'

我該如何解決這個問題或者是否有其他解決方案來查找EXIF信息?

+0

我猜你使用一個選擇器(REQUEST_IMAGE_PICK)來識別路徑圖像? – Neil 2015-02-11 11:07:25

+0

我在這裏發現了一個類似的問題http://stackoverflow.com/questions/19834842/android-gallery-on-kitkat-returns-different-uri-for-intent-action-get-content – Neil 2015-02-11 11:23:41

回答

1

問題在於權限。將權限android.permission.READ_EXTERNAL_STORAGE添加到您的清單。

6

我遇到了同樣的問題。 V19及以上版本中提供的採集器可能會爲您提供此結果。試試下面的代碼,應該解決你的問題。


你修改後的代碼

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

這段代碼幾乎適用於我。謝謝。要添加的一件事是DocumentsContract.getDocumentId(contentUri)僅在DocumentsContract.isDocumentUri返回true時起作用。所以我去了,如果它是> = 19,然後isDocumentUri然後使用getPathForV19AndUp。否則使用getPathForPreV19。 – RyanShao 2015-10-29 09:48:31