Захваченная ориентация фото меняется в андроиде

Я открываю приложение для камеры одним нажатием кнопки. И отображение снятой фотографии в следующей активности. Но захваченное фото вращается на 90 градусов. Когда я показываю изображение в представлении после его захвата, это ориентация всегда ландшафта. Почему фотография не отображается на портрете, как при фотосъемке в портретном режиме?

OnНажмите кнопку:

Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(APP_DIR+"/latest.png"))); startActivityForResult(i, CAPTURE_PHOTO_CONSTANT); 

Внутри onActvityresult:

 bmp = BitmapFactory.decodeFile(APP_DIR+"/latest.png"); startActivity(new Intent(this, DisplayActivity.class)); 

Отображение снятой фотографии:

 photoViewRelativeLayout.setBackgroundDrawable(new BitmapDrawable(getResources(), CaptureActivity.bmp)); 

У меня была та же проблема в основном с телефонами Samsung. Очевидно, телефоны Samsung устанавливают ориентационный тег EXIF, а не вращают отдельные пиксели. Запуск Bitmap с использованием BitmapFactory не поддерживает этот тег. Что я нашел решение этой проблемы, было использование ExifInterface в onActivityResult Метод активности. Он проверяет ориентацию, связанную с URI захваченного изображения с камеры.

  int rotate = 0; try { getContentResolver().notifyChange(imageUri, null); File imageFile = new File(imagePath); ExifInterface exif = new ExifInterface( imageFile.getAbsolutePath()); 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; } Log.v(Common.TAG, "Exif orientation: " + orientation); } catch (Exception e) { e.printStackTrace(); } /****** Image rotation ****/ Matrix matrix = new Matrix(); matrix.postRotate(orientation); Bitmap cropped = Bitmap.createBitmap(scaled, x, y, width, height, matrix, true); 

Я немного поработал. Когда я снимаю фотографию в ландшафтном режиме, все работает отлично, как раньше. Если я возьму фотографию в портретном режиме, мне нужно перевернуть камеру вверх дном, и pic выглядит хорошо. Если вы заметили, что я немного изменил ваш код, добавив «ExifInterface» перед каждой ориентацией. Я использовал следующий код:

  try { ExifInterface exif = new ExifInterface(filename); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); int rotate = 0; switch(orientation) { case ExifInterface.ORIENTATION_ROTATE_270: rotate-=90;break; case ExifInterface.ORIENTATION_ROTATE_180: rotate-=90;break; case ExifInterface.ORIENTATION_ROTATE_90: rotate-=90;break; } Log.d("Fragment", "EXIF info for file " + filename + ": " + rotate); } catch (IOException e) { Log.d("Fragment", "Could not get EXIF info for file " + filename + ": " + e); } 

Вы можете просто просто повернуть его

Получить америзацию изображения, сделанного с помощью этого кода, в onActvityresult ….

 File imageFile = new File(imageUri.toString()); ExifInterface exif = new ExifInterface(imageFile.getAbsolutePath()); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); int rotate = 0; switch(orientation) { case ORIENTATION_ROTATE_270: rotate-=90;break; case ORIENTATION_ROTATE_180: rotate-=90;break case ORIENTATION_ROTATE_90: rotate-=90;break } 
Intereting Posts
Не удалось найти цель с помощью строки hash-android-25, хотя андроид-25 фактически установлен Как запустить хронометр в обратном порядке в андроиде? OpenGL ES – пунктирные линии NullPointerException: попытка чтения из поля 'int android.view.View.mViewFlags' Android Espresso. Как проверить ErrorText в TextInputLayout Разница между ActionBarSherlock и совместимостью ActionBar Должен ли я комментировать мои запросы на журнал при создании моего последнего пакета? Автоматизация тестирования iPhone – контрольные инструменты? Как изменить / изменить вид из макета в RemoteView или создать RemoteView из представления? Как отличить, будет ли onDestroy вызываться после onPause Настройка Multi Orientation – Android Как получить FileInputStream для файлов внутренней памяти в Android? Файл находится в моей пользовательской папке, созданной в прикладном пространстве. Как предотвратить перезапуск приложения при использовании пусковой установки после магазина? Обнаружение исходящего звонка на Android Ошибка при выполнении aapt: не удается запустить программу