如何将ExifInterface与stream或URI一起使用

我正在编写一个应用程序,可以从Android的“通过共享”菜单发送照片URI。

你得到的URItypes是content://media/external/images/media/556但是ExifInterface一个标准的文件名。 那么如何读取该文件的Exif数据(我只想定位)呢? 这是我的(非工作)代码:

 Uri uri = (Uri)extras.getParcelable(Intent.EXTRA_STREAM); ContentResolver cr = getContentResolver(); InputStream is = cr.openInputStream(uri); Bitmap bm = BitmapFactory.decodeStream(is); // This line doesn't work: ExifInterface exif = new ExifInterface(uri.toString()); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); 

任何帮助(除了“你必须写你自己的ExifInterface类”)赞赏!

Solutions Collecting From Web of "如何将ExifInterface与stream或URI一起使用"

我在Facebook Android SDK示例中随机find答案。 我没有testing过,但它看起来应该工作。 代码如下:

 public static int getOrientation(Context context, Uri photoUri) { /* it's on the external media. */ Cursor cursor = context.getContentResolver().query(photoUri, new String[] { MediaStore.Images.ImageColumns.ORIENTATION }, null, null, null); int result = -1; if (null != cursor) { if (cursor.moveToFirst()) { result = cursor.getInt(0); } cursor.close(); } return result; } 

您可以使用文件名string或InputStream获取ExifInterface,方法是在build.gradle文件中导入支持ExifInterface:

 compile 'com.android.support:exifinterface:26.1.0' 

然后:

 private getExifInterfaceFromUri(Uri uri) throws IOException{ FileInputStream fi = new FileInputStream(uri.getPath()); return new ExifInterface(stream); } 

请记住,Android中有多种Uritypes,您可能需要使用Content Resolver和其他方法才能从Uri获得真正的path。