Как я могу найти ориентацию изображения, сделанного с помощью Intent MediaStore.ACTION_IMAGE_CAPTURE?

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

Однако, когда я использую

Intent imageCaptureIntent = новое намерение (MediaStore.ACTION_IMAGE_CAPTURE);

Для получения изображения приложение камеры не реагирует на ориентацию. Если я держу телефон вертикально (портрет), результат будет повернут, а крыша здания будет левее экрана.

Как я могу установить намерение, чтобы камера учитывала ориентацию?

Или я могу каким-то образом определить, в какой ориентации был сделан снимок, и потом повернуть его сам?

Или любое другое предложение будет с благодарностью оценено.

~ Спасибо заранее, с наилучшими пожеланиями.

Нашел ответ. Экзим изображения имеет индикатор ориентации. На всякий случай exif можно посмотреть на Android так:

ExifInterface exif = new ExifInterface("filepath"); exif.getAttribute(ExifInterface.TAG_ORIENTATION); 

Читайте из Exif, если доступно, иначе читайте в MediaStore

 public static int getImageOrientation(Context context, String imagePath) { int orientation = getOrientationFromExif(imagePath); if(orientation <= 0) { orientation = getOrientationFromMediaStore(context, imagePath); } return orientation; } private static int getOrientationFromExif(String imagePath) { int orientation = -1; try { ExifInterface exif = new ExifInterface(imagePath); int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (exifOrientation) { case ExifInterface.ORIENTATION_ROTATE_270: orientation = 270; break; case ExifInterface.ORIENTATION_ROTATE_180: orientation = 180; break; case ExifInterface.ORIENTATION_ROTATE_90: orientation = 90; break; case ExifInterface.ORIENTATION_NORMAL: orientation = 0; break; default: break; } } catch (IOException e) { Log.e(LOG_TAG, "Unable to get image exif orientation", e); } return orientation; } private static int getOrientationFromMediaStore(Context context, String imagePath) { Uri imageUri = getImageContentUri(context, imagePath); if(imageUri == null) { return -1; } String[] projection = {MediaStore.Images.ImageColumns.ORIENTATION}; Cursor cursor = context.getContentResolver().query(imageUri, projection, null, null, null); int orientation = -1; if (cursor != null && cursor.moveToFirst()) { orientation = cursor.getInt(0); cursor.close(); } return orientation; } private static Uri getImageContentUri(Context context, String imagePath) { String[] projection = new String[] {MediaStore.Images.Media._ID}; String selection = MediaStore.Images.Media.DATA + "=? "; String[] selectionArgs = new String[] {imagePath}; Cursor cursor = context.getContentResolver().query(IMAGE_PROVIDER_URI, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { int imageId = cursor.getInt(0); cursor.close(); return Uri.withAppendedPath(IMAGE_PROVIDER_URI, Integer.toString(imageId)); } if (new File(imagePath).exists()) { ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DATA, imagePath); return context.getContentResolver().insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); } return null; } 

Для быстрого исправления вы можете проверить, больше ли ширина изображения больше высоты изображения. Это означает, что это пейзаж, и вы можете изменить его на портрет.

 private Bitmap fromGallery(final Uri selectedImageUri) { try { Bitmap bm = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImageUri); ExifInterface exif = new ExifInterface(selectedImageUri.getPath()); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); int angle = 0; switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: angle = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: angle = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: angle = 270; break; default: angle = 0; break; } Matrix mat = new Matrix(); if (angle == 0 && bm.getWidth() > bm.getHeight()) mat.postRotate(90); else mat.postRotate(angle); return Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), mat, true); } catch (IOException e) { Log.e("", "-- Error in setting image"); } catch (OutOfMemoryError oom) { Log.e("", "-- OOM Error in setting image"); } return null; }