2015-05-29 1 views
0

Im пытается повернуть мою камеру, когда устройство вращается, iv пробовал несколько методов, но ни один из них, похоже, не работает на всех устройствах.Вращение камеры Android Generic

// Это работает на моем Nexus 5, но не на моей вкладке Samsung Galaxy

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
{ 
    if (mHolder.getSurface() == null) 
    { 
     return; 
    } 

    try 
    { 
     mCamera.stopPreview(); 

     Camera.Parameters parameters = mCamera.getParameters(); 
     parameters.set("orientation", "landscape"); 
     int rotation = ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation(); 

     int orientation = getContext().getResources().getConfiguration().orientation; 

     if (rotation == Surface.ROTATION_0) { 
      if (orientation == Configuration.ORIENTATION_LANDSCAPE) { 
       mCamera.setDisplayOrientation(0); 
      } else { 
       mCamera.setDisplayOrientation(90); 
      } 
     } 
     else if (rotation == Surface.ROTATION_90) { 
      if (orientation == Configuration.ORIENTATION_PORTRAIT) { 
       mCamera.setDisplayOrientation(270); 
      } 
     } 
     else if (rotation == Surface.ROTATION_180) { 
      if (orientation == Configuration.ORIENTATION_LANDSCAPE) { 
       mCamera.setDisplayOrientation(180); 
      } 
     } 
     else if (rotation == Surface.ROTATION_270) { 
      if (orientation == Configuration.ORIENTATION_PORTRAIT) { 
       mCamera.setDisplayOrientation(90); 
      } 
     } 

     mCamera.setPreviewDisplay(holder); 
     mCamera.startPreview(); 
    } 
    catch (Exception e) { 
    } 
} 

// и я попытался это, которая является частью документации и он не работает на моем Nexus 5:

public static void setCameraDisplayOrientation(Activity activity, 
     int cameraId, android.hardware.Camera camera) { 
    android.hardware.Camera.CameraInfo info = 
      new android.hardware.Camera.CameraInfo(); 
    android.hardware.Camera.getCameraInfo(cameraId, info); 
    int rotation = activity.getWindowManager().getDefaultDisplay() 
      .getRotation(); 
    int degrees = 0; 
    switch (rotation) { 
     case Surface.ROTATION_0: degrees = 0; break; 
     case Surface.ROTATION_90: degrees = 90; break; 
     case Surface.ROTATION_180: degrees = 180; break; 
     case Surface.ROTATION_270: degrees = 270; break; 
    } 
      int result; 
    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
     result = (info.orientation + degrees) % 360; 
     result = (360 - result) % 360; // compensate the mirror 
    } else { // back-facing 
     result = (info.orientation - degrees + 360) % 360; 
    } 
    camera.setDisplayOrientation(result); 
} 

У кого-нибудь есть рабочее решение для всех устройств?

+0

Что именно вы подразумеваете под словом «это не работает»? Вы выводите изображения, которые вращаются? – simekadam

+0

Камера повернута неправильно. Извините, если я не был ясен в своем вопросе. –

ответ

2

Хотя я не совсем уверен, что ваш вопрос из кода вы предоставили, вот несколько вещей, один имеет для меня прямо при использовании API камеры и поворот изображения на Android (старый - на API < 21)

1. Вы должны принять во внимание датчик изображения orientation.

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

Например, предположим, что устройство имеет естественный высокий экран. Обратный датчик камеры монтируется в ландшафтном режиме. Вы смотрите на экран. Если верхняя сторона датчика камеры выровнена с правым краем экрана в естественной ориентации, значение должно быть 90. Если верхняя сторона датчика передней панели камеры выровнена с правой стороны экрана, значение должно быть 270.

2. frontfacing предварительный просмотр камеры отражаясь

Если вы используете frontfacing камеру, вы должны принять во внимание неявную зеркальное отображение.

3. Эти правила предназначены только для поворота камеры предварительного просмотра

Это важно. Все это предназначено только для того, чтобы вы могли правильно отображать кадры предварительного просмотра на экране устройства. После того, как вы сделаете фактическое изображение, вам нужно снова его повернуть в соответствии с вашими потребностями. Для изображений, обращенных к передней панели, это может означать зеркальное отражение самого себя ... Вы можете увидеть результат этой «странности» среди всех приложений на Android. Просто сделайте снимок в видеовстрече и поделитесь им сразу. На разных телефонах вы должны получить несколько странно повернутое изображение в результате.

4. OEM-производители не придерживаются спецификации всего времени

Все, что я могу сказать, это то, что, вероятно, ни одно решение не будет hasslefree, мы получили некоторые проблемы с некоторыми конкретными устройствами. (Как обычно на Android :)

5. Использование библиотеке CWAC камеры

Мы нашли this library быть выше оберткой официальных API для камеры. Решая практически все вопросы, которые я упоминал.

+0

Привет, Спасибо за все понимание, я могу понять, почему они создали новый API-интерфейс камеры. Я не буду использовать библиотеку, но это полезная ссылка. –

+0

.. назад к вашей проблеме .. у вас есть проблема с предварительным просмотром или результирующим изображением? как вы можете видеть, это две разные вещи. – simekadam

+0

Моя проблема с предварительным просмотром, я не собираюсь фотографировать. Мне просто нужен предварительный просмотр –