2016-09-16 90 views
6

我问这个的原因是因为文件选择器Intent的回调返回Uri。通过意向如何从InputStream而不是文件获取Exif数据?

打开文件选择:

Intent intent = new Intent(); 
intent.setType("image/*"); 
intent.setAction(Intent.ACTION_GET_CONTENT); 
startActivityForResult(Intent.createChooser(intent, "Select Picture"), CHOOSE_IMAGE_REQUEST); 

回调:

@Override 
public void onActivityResult(int requestCode, int resultCode, final Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == CHOOSE_IMAGE_REQUEST && resultCode == Activity.RESULT_OK) { 

     if (data == null) { 
      // Error 
      return; 
     } 

     Uri fileUri = data.getData(); 
     InputStream in = getContentResolver().openInputStream(fileUri); 

     // How to determine image orientation through Exif data here? 
    } 
} 

一种方式是写InputStream到实际File,但是这似乎是一个不好的解决办法我。

回答

8

在引入25.1.0支持库之后,现在可以通过InputStream从URI内容(content://或file://)读取exif数据。

例子: 首先这行添加到您的gradle这个文件:

编译 'com.android.support:exifinterface:25.1.0'

Uri uri; // the URI you've received from the other app 
InputStream in; 
try { 
    in = getContentResolver().openInputStream(uri); 
    ExifInterface exifInterface = new ExifInterface(in); 
    // Now you can extract any Exif tag you want 
    // Assuming the image is a JPEG or supported raw format 
} catch (IOException e) { 
    // Handle any errors 
} finally { 
    if (in != null) { 
    try { 
     in.close(); 
    } catch (IOException ignored) {} 
    } 
} 

欲了解更多信息,检查: Introducing the ExifInterface Support LibraryExifInterface

相关问题