Как получить данные Exif из InputStream, а не файла?

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

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

 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 , но это кажется плохим обходным решением для меня.

После внедрения библиотеки поддержки 25.1.0 теперь можно читать данные exif из содержимого URI (content: // или file: //) через InputStream .

Пример: сначала добавьте эту строку в свой файл gradle:

Compile '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) {} } } 

Для получения дополнительной информации проверьте: Знакомство с библиотекой поддержки ExifInterface , ExifInterface .