2013-04-19 3 views
1

Я использую этот код:изображение сохраняется с неправильной ориентацией

https://github.com/commonsguy/cw-advandroid/blob/master/Camera/Picture/src/com/commonsware/android/picture/PictureDemo.java

где в Manifest, Activity Orientation установлен в Пейзаж.

Так, его, как позволяет пользователю сделать снимок только в ландшафтном режиме, и если изображение принимает, удерживая устройство в портретном режиме, изображение сохранено как это:

enter image description here

90-градусное повернутое изображение.

После поиска решения, я нашел это:

Android - Camera preview is sideways

где решение:

в surfaceChanged() чек на

Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 
display.getRotation(); 

и изменить Отображение камерыОценка соответственно.

camera.setDisplayOrientation(90); 

Но независимо от того, сколько раз я повернуть устройство, surfaceChanged() никогда не вызывается.

Я даже попытался удалить orientation="Landscape" в Manifest.xml, но затем сам просмотр показан сбоку (может быть потому, что по умолчанию android.view.SurfaceView должен быть в ландшафтном режиме?).

+0

Проверьте эту ссылку, это может быть полезно для вас. http://stackoverflow.com/questions/5157984/android-camera-surfaceview-orientation –

+0

Ну, есть * причины, почему я больше не закрываю этот код в книге ... :-) Я оставил его в репо по историческим причинам, но, безусловно, есть проблемы с ним. FWIW, я планирую пересмотреть эту тему в ближайшие месяцы с прицелом на устранение этой проблемы, и поэтому я сделал это для изучения этого вопроса. Однако прямо сейчас у меня нет конкретных советов для вас - извинения. – CommonsWare

ответ

4

Попробуйте это.

public void surfaceCreated(SurfaceHolder holder) { 
    try { 
     camera = Camera.open(); 
     camParam = camera.getParameters(); 
     Camera.Parameters params = camera.getParameters(); 
     String currentversion = android.os.Build.VERSION.SDK; 
     Log.d("System out", "currentVersion " + currentversion); 
     int currentInt = android.os.Build.VERSION.SDK_INT; 
     Log.d("System out", "currentVersion " + currentInt); 

     if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { 
      if (currentInt != 7) { 
       camera.setDisplayOrientation(90); 
      } else { 
       Log.d("System out", "Portrait " + currentInt); 

       params.setRotation(90); 

       /* 
       * params.set("orientation", "portrait"); 
       * params.set("rotation",90); 
       */ 
       camera.setParameters(params); 
      } 
     } 
     if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { 
      // camera.setDisplayOrientation(0); 
      if (currentInt != 7) { 
       camera.setDisplayOrientation(0); 
      } else { 
       Log.d("System out", "Landscape " + currentInt); 
       params.set("orientation", "landscape"); 
       params.set("rotation", 90); 
       camera.setParameters(params); 
      } 
     } 
     camera.setPreviewDisplay(holder); 
     camera.startPreview(); 
    } catch (IOException e) { 
     Log.d("CAMERA", e.getMessage()); 
    } 
} 
+1

Я думаю, что это будет работать только в первый раз, потому что написано в 'surfaceCreated()'. Позже (как только предварительный просмотр включен), если пользователь меняет ориентацию устройства, ничего не происходит, и сделанное изображение снова будет боком. –

+0

Работает ли это на всех устройствах? – Ahmed

0

Поскольку вы заставили ваше приложение будет пейзаж, конфигурация вашего приложения не будет меняться при повороте устройства, и, как следствие, ваш интерфейс не получит перерисовывается. Из-за этого вы никогда не увидите обратного вызова surfaceCreated/Changed.

В любом случае, проблема заключается не в предварительном просмотре, а в снятых снимках.

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

Поэтому я настоятельно рекомендую вам использовать код, предоставленный в документации setRotation, и наследовать от OrientationEventListener, реализации слушателя следующим образом:

public void onOrientationChanged(int orientation) { 
    if (orientation == ORIENTATION_UNKNOWN) return; 
    android.hardware.Camera.CameraInfo info = 
     new android.hardware.Camera.CameraInfo(); 
    android.hardware.Camera.getCameraInfo(cameraId, info); 
    orientation = (orientation + 45)/90 * 90; 
    int rotation = 0; 
    if (info.facing == CameraInfo.CAMERA_FACING_FRONT) { 
     rotation = (info.orientation - orientation + 360) % 360; 
    } else { // back-facing camera 
    rotation = (info.orientation + orientation) % 360; 
    } 
    mParameters.setRotation(rotation); 
} 

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

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