Хорошо, ребята, похоже, что эта ошибка для Android не будет исправлена некоторое время. Хотя я нашел способ реализовать ExifInformation так, чтобы оба устройства (те, которые имеют правильный тег Exif, а также неправильные теги exif работали вместе) ..
Таким образом, проблема возникает на некоторых (более новых) устройствах, есть ошибка, из-за которой сделанный снимок сохраняется в папке вашего приложения без надлежащих тегов exif, а правильно повернутое изображение сохраняется в папке по умолчанию для Android (хотя это не должно происходить). быть) ..
Теперь я записываю время запуска приложения камеры из моего приложения. Затем по результатам активности я запрашиваю медиа-провайдера, чтобы посмотреть, были ли какие-либо изображения сохранены после этой временной метки, которую я сохранил. Это означает, что, скорее всего, ОС сохранила правильно повернутое изображение в папке по умолчанию и, конечно, поместила запись в хранилище мультимедиа, и мы можем использовать информацию о повороте из этой строки. Теперь, чтобы убедиться, что мы смотрим на правильное изображение, я сравниваю размер этого файла с тем, к которому у меня есть доступ (сохранен в моей папке приложения);
int rotation =-1;
long fileSize = new File(filePath).length();
Cursor mediaCursor = content.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[] {MediaStore.Images.ImageColumns.ORIENTATION, MediaStore.MediaColumns.SIZE }, MediaStore.MediaColumns.DATE_ADDED + ">=?", new String[]{String.valueOf(captureTime/1000 - 1)}, MediaStore.MediaColumns.DATE_ADDED + " desc");
if (mediaCursor != null && captureTime != 0 && mediaCursor.getCount() !=0 ) {
while(mediaCursor.moveToNext()){
long size = mediaCursor.getLong(1);
//Extra check to make sure that we are getting the orientation from the proper file
if(size == fileSize){
rotation = mediaCursor.getInt(0);
break;
}
}
}
Теперь, если вращение в этой точке все еще равно -1, то это означает, что это один из телефонов с правильной информацией о вращении. На этом этапе мы можем использовать обычную ориентацию exif для файла, который возвращается нашему onActivityResult
else if(rotation == -1){
rotation = getExifOrientationAttribute(filePath);
}
Вы можете легко узнать, как найти exif-ориентации, например, ответ на этот вопрос Проблема ориентации камеры в Android
Также обратите внимание, что ExifInterface поддерживается только после Api уровня 5. Поэтому, если вы хотите поддерживать телефоны до 2.0, то вы можете использовать эту удобную библиотеку, которую я нашел для любезности Java Drew Noakes; http://www.drewnoakes.com/code/exif/
Удачи в повороте изображения!
РЕДАКТИРОВАТЬ: Потому что его спросили, намерение, которое я использовал и как я начал, было так
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//mediaFile is where the image will be saved
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mediaFile));
startActivityForResult(intent, 1);