Проблема с ориентацией изображения 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;
             }
        }
    };
13
задан Bryan 26 July 2012 в 20:05
поделиться