Отображение предварительного просмотра захвата изображения в Android MediaStore в неправильной ориентации

При захвате фотографии с помощью намерения MediaStore.ACTION_IMAGE_CAPTURE отображаемый предварительный просмотр имеет неправильную ориентацию. Это происходит только на нескольких устройствах. Прилагается скриншот того, как это выглядит. Фотография была сделана с передней камерой на портрете. Наше приложение уже обрабатывает коррекцию ориентации, поэтому, когда пользователь нажимает кнопку проверки, оно находится в правильной ориентации. Проблема действительно в предварительном просмотре.

Пробовал с помощью i.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);, но это не работает. Есть ли способ решить это? Или я должен реализовать кастомную камеру?

РЕДАКТИРОВАТЬ: Я имел в виду предварительный просмотр после того, как вы сделали снимок и перед тем, как выбрать / завершить снимок. В нашем сценарии (как показано на прикрепленном снимке экрана) функция onActivityResult() еще не вызывается. Нажатие на кнопку проверки вызывает функцию обратного вызова onActivityResult().

Снято с передней камеры на портрете

1 ответ

Большинство телефонных камер имеют альбомную ориентацию. Это означает, что если вы сделаете фотографию в портретной ориентации, полученные фотографии будут повернуты на 90 градусов. В этом случае программное обеспечение камеры должно заполнять данные EXIF ​​в той ориентации, в которой должна просматриваться фотография. Я копирую этот ответ отсюда

В противном случае, вы можете получить поворот от камеры, а затем сделать все, что вы хотите, чтобы вернуть изображение. Полный код здесь Этот пример о сборщике изображений, но возвращенное изображение обработки кода помогает мне контролировать поворот изображения.

private int getRotationFromCamera(Context context, Uri imageFile) {
        int rotate = 0;
        try {

            context.getContentResolver().notifyChange(imageFile, null);
            ExifInterface exif = new ExifInterface(imageFile.getPath());
            int orientation = exif.getAttributeInt(
                    ExifInterface.TAG_ORIENTATION,
                    ExifInterface.ORIENTATION_NORMAL);

            switch (orientation) {
                case ExifInterface.ORIENTATION_ROTATE_270:
                    rotate = 270;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_180:
                    rotate = 180;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_90:
                    rotate = 90;
                    break;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return rotate;
    }
Другие вопросы по тегам