2016-09-16 3 views
6

Причина, по которой я спрашиваю об этом, заключается в том, что обратный вызов выбора файла Intent возвращает Uri.Как получить данные Exif из InputStream, а не из файла?

Открыть Chooser файл с помощью Intent:

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

Callback:

@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 теперь можно читать данные exif из содержимого URI (content: // или file: //) через InputStream.

Пример: Сначала добавьте эту строку в файл 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 Library, ExifInterface.