2015-02-11 93 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