Как использовать ExifInterface с потоком или URI - PullRequest
8 голосов
/ 18 декабря 2011

Я пишу приложение, в которое можно отправить URI фотографии из меню «Поделиться через» в Android.

Тип получаемого вами URI: 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") приветствуется!

Ответы [ 2 ]

16 голосов
/ 29 декабря 2011

Я нашел ответ случайно в примерах Facebook Android SDK.Я не проверял это, но похоже, что оно должно работать.Вот код:

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;
}
0 голосов
/ 19 октября 2017

Вы можете получить ExifInterface, используя строку имени файла или InputStream, импортировав вспомогательный ExifInterface в свой файл build.gradle:

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 существует несколько типов Uri, и вам может понадобиться использовать Content Resolver и другие подходы, чтобы получить реальный путь от Uri.

...