Отображение предварительного просмотра захвата изображения в 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;
}