Я написал пользовательское действие камеры, чтобы справиться с некоторыми проблемами, которые у меня возникали с некоторыми устройствами 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;
}
}
};