Ответ 1
Изображение всегда берется в ориентации камеры, встроенной в устройство. Чтобы ваше изображение повернулось правильно, вам нужно будет прочитать информацию о ориентации, которая хранится в изображении (EXIF-метаданные). Там хранится то, как устройство было ориентировано, когда было сделано изображение.
Вот код, который считывает данные EXIF и соответственно поворачивает изображение:
file
- это имя файла изображения.
BitmapFactory.Options bounds = new BitmapFactory.Options();
bounds.inJustDecodeBounds = true;
BitmapFactory.decodeFile(file, bounds);
BitmapFactory.Options opts = new BitmapFactory.Options();
Bitmap bm = BitmapFactory.decodeFile(file, opts);
ExifInterface exif = new ExifInterface(file);
String orientString = exif.getAttribute(ExifInterface.TAG_ORIENTATION);
int orientation = orientString != null ? Integer.parseInt(orientString) : ExifInterface.ORIENTATION_NORMAL;
int rotationAngle = 0;
if (orientation == ExifInterface.ORIENTATION_ROTATE_90) rotationAngle = 90;
if (orientation == ExifInterface.ORIENTATION_ROTATE_180) rotationAngle = 180;
if (orientation == ExifInterface.ORIENTATION_ROTATE_270) rotationAngle = 270;
Matrix matrix = new Matrix();
matrix.setRotate(rotationAngle, (float) bm.getWidth() / 2, (float) bm.getHeight() / 2);
Bitmap rotatedBitmap = Bitmap.createBitmap(bm, 0, 0, bounds.outWidth, bounds.outHeight, matrix, true);
ОБНОВЛЕНИЕ 2017-01-16
С выпуском 25.1.0 Support Library была представлена библиотека поддержки ExifInterface, которая, возможно, облегчит доступ к атрибутам Exif. См. Блог разработчиков Android для статьи об этом.