Android:从URI获取EXIF旋转

我想找出图片的EXIF旋转。 当图片显示在图库中时,图片不会旋转,但在用EXIF信息“向左旋转”加载图像后,图片会显示为旋转。

现在我想问用户,如果他想使用旋转的图像或原件。

我得到一个Uri的方法,并将其存储在一个位图

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

现在我想使用ExifInterface来确定旋转,但是ExifInterface需要一个path:

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

现在我遇到了path问题,logcat显示以下消息:

E / JHEAD:无法打开'/ document / image:15035'

我该如何解决这个问题或者是否有其他解决scheme来查找EXIF信息?

Solutions Collecting From Web of "Android:从URI获取EXIF旋转"

我遇到了同样的问题。 V19及以上的api提供的采集器可能会给你这个结果。 试试下面的代码,应该解决你的问题。


您修改的代码

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

问题在于权限。 将权限android.permission.READ_EXTERNAL_STORAGE添加到您的清单。