Как получить информацию об ориентации изображения в android 10? - PullRequest
0 голосов
/ 06 января 2020

С android 10 произошли некоторые изменения в доступе к медиа-файлам. После просмотра документации https://developer.android.com/training/data-storage/shared/media я смог загрузить мультимедийный контент в растровое изображение, но не получил информацию об ориентации. Я знаю, что есть некоторые ограничения на информацию о местоположении изображения, но влияют ли эти ограничения exif также на информацию об ориентации? Если есть какой-либо другой способ получить информацию об ориентации изображения, пожалуйста, дайте мне знать. Код, который я использую, приведен ниже (который всегда возвращает 0 - значение для неопределенного). Спасибо.

ContentResolver resolver = getApplicationContext().getContentResolver();
try (InputStream stream = resolver.openInputStream(selectedFileUri)) {
 loadedBitmap = BitmapFactory.decodeStream(stream);
 ExifInterface exif = new ExifInterface(stream);
 orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
}

Ответы [ 2 ]

2 голосов
/ 06 января 2020

BitmapFactory.decodeStream израсходовал весь поток и закрыл его.

Вы должны открыть новый поток, прежде чем пытаться прочитать exif.

0 голосов
/ 06 января 2020

Во-первых, рассмотрим API, используемый в другой версии SDK, пожалуйста, используйте AndroidX ExifInterface Library

Во-вторых, ExifInterface для чтения и записи тегов Exif в различных форматах файлов изображений. Поддерживается для чтения: JPEG, PNG, WebP, HEIF, DNG, CR2, NEF, NRW, ARW, RW2, ORF, PEF, SRW, RAF.

Но вы используете его для растрового изображения, растровое изображение не имеет заголовков EXIF. Вы уже выбросили любые данные EXIF, когда загружали растровое изображение, откуда бы оно ни исходило. Используйте ExifInterface для исходного источника данных, а не для Bitmap

, вы можете попробовать использовать следующий код для получения информации и не забудьте использовать исходный поток.

public static int getExifRotation(Context context, Uri imageUri) throws IOException {
    if (imageUri == null) return 0;
    InputStream inputStream = null;
    try {
        inputStream = context.getContentResolver().openInputStream(imageUri);
        ExifInterface exifInterface = new ExifInterface(inputStream);
        int orienttation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED)
        switch (orienttation) {
            case ExifInterface.ORIENTATION_ROTATE_90:
                return 90;
            case ExifInterface.ORIENTATION_ROTATE_180:
                return 180;
            case ExifInterface.ORIENTATION_ROTATE_270:
                return 270;
            default:
                return ExifInterface.ORIENTATION_UNDEFINED;
        }
    }finally {
       //here to close the inputstream
    }
}

...