Проблема ориентации изображения Android с пользовательской активностью камеры
Я написал пользовательскую операцию с камерой для решения некоторых проблем, которые у меня возникали с определенными устройствами Android при вызове намеренного захвата изображения. Пользователь может выбрать сохранить изображение или просто использовать данные, возвращенные изOnPictureTakenCallback
.
Проблема, с которой я сталкиваюсь, заключается в правильном отображении изображения относительно ориентации, в которой оно было принято. Я заставляю деятельность отображаться в портрете, вызываяSetRequestedOrientation
.
Как я узнаю правильную ориентацию камеры, когда пользователь сделал снимок? пользователь может сделать снимок с поворотом на 90 (портрет).
Я пытался использоватьgetRotation()
на дисплее оконного менеджера по умолчанию, но с установкой запрошенной ориентации на портрет, которая только возвращаетSurface.ROTATION_0
.
Обновить:
Чтобы прояснить мою другую проблему, как я мог определить ориентацию только изbyte[]
данные в картинке обратного вызова, если пользователь не сохранить изображение?
Обновление: после попытки ответов ниже с этим кодом все, что я получаю, - это ExifInterface.ORIENTATION_NORMAL. Я также изменил свой код, чтобы просто сохранить файл, возвращенный с камеры, поскольку я не уверен, что существует простой способ определить ориентацию, просто имеяbyte[]
данные.
private PictureCallback mPicture = new PictureCallback()
{
@Override
public void onPictureTaken(byte[] data, Camera camera)
{
File directory = new File(android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_PICTURES),
"MyApp");
if(!directory.exists())
{
if(!directory.mkdirs())
{
Log.d("CAMERA", "Unable to create directory to save photos.");
return;
}
}
File file = new File(directory.getPath() + file.separator + "IMG_" + SimpleDateFormat.getDateTimeInstance().toString() + ".jpg");
FileOutputStream fos = new FileOutputStream(file);
fos.write(data);
fos.close();
ExifInterface exif = new ExifInterface(file.getCanonicalPath());
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
int rotate = 0;
switch (orientation)
{
case ExifInterface.ORIENTATION_ROTATE_90:
rotate = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotate = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
rotate = 270;
break;
case default:
break;
}
}
};