2014-08-29 2 views
0

Я хочу, чтобы получить ориентацию устройства, который теоретически должен работать, используя это:Android - получить ориентацию устройства после съемки фотографии

getActivity().getResources().getConfiguration().orientation; 

Однако я заметил, что иногда, после того, как я назвал камеру с помощью этого кода:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
fileUri = getOutputMediaFile(1); // create a file to save the image 
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name 
// start the image capture Intent 
intent.putExtra(GlobalDefines.IMAGE_NR, 1); 
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE_1); 

и после того, как я принял образ, когда я пытаюсь получить ориентацию устройства в onActivityResult (который вызывается после того, как снимок сделан) ориентация устройства указывается режим «пейзаж», хотя я сфотографировал в портретный режим и устройство удерживается в портретном режиме.

Странная вещь в том, что это происходит только около 3 из 10 раз. Похоже, что при съемке ориентация устройства внутренне изменяется на «ландшафтный режим» (даже если изображение выполняется в портретном режиме), а после съемки изображения требуется некоторое время, пока устройство не осознает, что оно находится в портрете Режим.

Что я могу сделать?

+0

Лучше использовать ориентацию изображения, так как некоторые устройства + программы камеры выполняют странные изменения ориентации. –

+0

Да, я заметил, вот почему я хотел знать ориентацию устройства (потребуется больше времени, чтобы объяснить, почему именно), главная проблема в том, что мои exif-изображения-данные также кажутся странными ... – deimos1988

+1

Некоторые устройства не пишите данные EXIF ​​тоже. Вы должны проверить ориентацию из «MediaStore.Images.ImageColumns.ORIENTATION». В любом случае, я всегда проверяю все ориентации в каскаде: MediaStore, EXIF, устройство. –

ответ

3

Если устройство не пишет надежную ориентацию EXIF, это может быть вызвано проблемами HW с датчиком ориентации (акселерометром). Нет смысла проверять ориентацию в приложении, если это так.

Я могу объяснить, почему иногда ваша деятельность не сообщает правильной (портретной) ориентации в onActivityResult() после съемки с помощью намерения и как эта ориентация может быть воспринята более надежным образом. Но, к сожалению, это будет напрасно.

Вы не можете рассчитывать на ориентацию устройства в тот момент, когда ваше приложение получает управление обратно из приложения камеры, потому что после того, как конечный пользователь действительно захватит изображение, она будет его просматривать, возможно, сделать еще одну попытку и, наконец, принять (или отклонить) фотографию. Во время всего этого длительного процесса после захвата устройство может вращаться много раз, сознательно или бессознательно, конечным пользователем. Поэтому, если вы не можете полагаться на ориентацию EXIF, но можете полагаться на датчики устройства, у вас нет выбора, кроме use a Camera object, сделав снимок в вашем приложении.

Теперь, для справки, вот схема объяснения, о которой я упомянул во втором абзаце.

Когда ваше приложение получает обратный вызов onActivityResult(), это может произойти после того, как ваша активность была уничтожена системой (чтобы освободить больше памяти для приложения «Камера»). У вас нет контроля над тем, произойдет ли это, но вы можете знать, было ли это так, когда элемент управления возвращается обратно в ваше приложение.

В данном случае ваша активность пока не известна его ориентацией. Он определяет эту ориентацию позже, непосредственно перед обратным вызовом onResume(). Поэтому вы не можете слепо полагаться на ориентацию активности, когда внутри onActivityResult(). Вы должны непосредственно прочитать датчик акселерометра и рассчитать, является ли ориентация ландшафтной или портретной (см. OrientationEventListener в качестве примера).

К сожалению, это только теоретический вариант, как я объяснял выше. И, к счастью, когда вы используете пользовательскую камеру, вы можете просто использовать вышеприведенный класс OrientationEventListener в своей деятельности, чтобы надежно определить ориентацию (в зависимости от надежности датчиков HW).

+0

Большое спасибо за ваш ответ. Но вы говорите, что я должен реализовать свою собственную камеру и не использовать для этого внешнее приложение, не так ли? – deimos1988

+0

Я бы начал с попытки понять, почему флаг EXIF ​​не работает. Кроме того, очень важно доказать, что датчик HW работает правильно. Но вы правы, резюме моего ответа таково: _если вы не можете полагаться на ориентацию EXIF, но можете полагаться на датчики устройства, у вас нет выбора, кроме использования объекта Camera, с помощью изображения внутри вашего приложения. –

+0

То, что вы сказали об уничтожении активности, чтобы освободить память для камеры, может быть причиной непоследовательного поведения. Я изменил некоторые настройки, поэтому используется меньше памяти, не знаю, будет ли это работать вечно. Я показываю картинку, которая была сделана в диалоговом окне диалога - возможно, это будет возможность подождать, скажем, 0,5 секунды, прежде чем получать ориентацию устройства, а затем отобразить диалоговое окно с этим изображением? – deimos1988

Смежные вопросы