2016-07-22 4 views
0

Я просмотрел другие вопросы, на которые люди спрашивали об этом, но я не был уверен, что лучший способ решить эту проблему. Пройдя через руководство по Android для реализации камеры, предварительный просмотр камеры у меня заблокирован в ландшафт. Я хотел знать, как настроить ориентацию камеры, чтобы отразить ориентацию телефона.Как установить ориентацию камеры в Android?

Я попробовал этот

camera.setDisplayOrientation(90); 

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

Также, как я могу сделать так, чтобы сохраненное изображение отображалось так же, как и предварительный просмотр? Прямо сейчас, если я использую эту строку кода выше, чтобы сделать предварительный просмотр до портрета, сохраненное изображение по-прежнему поворачивается для пейзажа. Thanks

ответ

3
Camera.Parameters params= mCamera.getParameters(); 
params.set("rotation", 90); 
mCamera.setParameters(params); 
+0

Это ничего не помогло мне – Jill

+0

вам нужно использовать params.set («rotation», 90); insted of setDisplayOrientation –

+0

Yup, я сделал это. Он ничего не делал, пока setDisplayOrientation что-то сделал. – Jill

0

Я исправил это с помощью приложения камеры Google. Он получает ориентацию телефона, используя датчик, и затем соответствующим образом устанавливает тег EXIF. JPEG, который выходит из камеры, не ориентирован автоматически.

Кроме того, предварительный просмотр камеры работает правильно только в ландшафтном режиме. Если вам нужно, чтобы ваш макет деятельности ориентировался на портрет, вам придется делать это вручную, используя значение от датчика ориентации.

Я рекомендовал бы проверить данные EXIF ​​ФОТОСНИМКА и ищет особенно

ExifInterface exif = new ExifInterface(SourceFileName); //API Level 5 
String exifOrientation = exif.getAttribute(ExifInterface.TAG_ORIENTATION); 

Оставить комментарий и дайте мне знать, если это поможет.

+0

Я не хочу использовать внешнюю программу для этого. – Jill

+0

Предварительный просмотр камеры не должен находиться в ландшафтном режиме. Начиная с Android 2.2 (API уровня 8), вы можете использовать метод setDisplayOrientation(), чтобы установить поворот изображения предварительного просмотра. Чтобы изменить ориентацию предварительного просмотра, когда пользователь перенаправляет телефон, в методе surfaceChanged() вашего класса предварительного просмотра сначала остановите предварительный просмотр с помощью Camera.stopPreview(), измените ориентацию и снова запустите предварительный просмотр с помощью Camera.startPreview (). –

+0

вы также можете узнать больше на https://developer.android.com/reference/android/hardware/Camera.Parameters.html#setRotation%28int%29 –

0

При определении размера предварительного просмотра вам необходимо учитывать ориентацию. Например, getOptimalPreviewSize() от ApiDemos не обращает внимания на ориентацию, просто потому, что их версия этого приложения имеет ориентацию, привязанную к ландшафту. Если вы хотите, чтобы ориентация плавала, вам нужно изменить целевой формат изображения для соответствия. Итак, где getOptimalPreviewSize() имеет этот

double targetRatio=(double)width/height; 

И

if (displayOrientation == 90 || displayOrientation == 270) { 
    targetRatio=(double)height/width; 
} 

где displayOrientation это значение от 0 до 360, что я Определяя из около 100 строк какого-то серьезно уродливого кода, поэтому я обертывая все это в повторно используемый компонент, который я опубликую в ближайшее время.

Во-вторых, вы должны учитывать эту ориентацию дисплея при управлении соотношением сторон используемого вами/TextureView. CameraPreview деятельности от ApiDemos имеет свой собственный просмотр ViewGroup, который обрабатывает соотношение сторон, и вы должны полностью изменить соотношение сторон для использования в портретном:

if (displayOrientation == 90 
     || displayOrientation == 270) { 
     previewWidth=mPreviewSize.height; 
     previewHeight=mPreviewSize.width; 
    } 
    else { 
     previewWidth=mPreviewSize.width; 
     previewHeight=mPreviewSize.height; 
    } 

где displayOrientation это то же самое значение (90 и 270 портретных и обратный портрет соответственно, и обратите внимание, что я не пробовал работать с обратным портретом или обратным пейзажем, поэтому может потребоваться больше настроек).

В-третьих - вы должны начать предварительный просмотр перед вызовом setPictureSize() на Camera.Parameters. В противном случае, как будто пропорции изображения применяются к кадрам предварительного просмотра, закручивая вещи вверх.

Camera.Parameters parameters=camera.getParameters(); 
Camera.Size pictureSize=getHost().getPictureSize(parameters); 

parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 

camera.setParameters(parameters); 
camera.startPreview(); 

parameters=camera.getParameters(); 
parameters.setPictureSize(pictureSize.width, pictureSize.height); 
parameters.setPictureFormat(ImageFormat.JPEG); 
camera.setParameters(parameters); 
+0

Где вы находите этот метод getOptimalPreviewSize()? – Jill

+0

private Размер getOptimalPreviewSize (Список размеры, int w, int h) {....} –

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