2014-10-20 1 views
1

В моем приложении используется камера. Чтобы отобразить предварительный просмотр камеры, как правильно, я должен учитывать ориентацию активности относительно ориентации физического устройства. I. e. если ориентация активности заблокирована и никогда не изменяется, мне не нужно предпринимать никаких дальнейших шагов - по мере поворота устройства изображение предварительного просмотра будет вращаться соответственно. Однако представьте, что моей деятельности разрешено изменять ориентацию. Вы поворачиваете устройство - и просматриваете - пока не достигнете портретного режима (при условии, что это был пейзаж первоначально), после чего активность поворачивается для адаптации к новой ориентации. Но изображение предварительного просмотра вращается вместе с ним, и теперь оно не синхронизируется с камерой и окружающей реальностью. То, что я должен сделать, это определить ориентацию активности и соответственно повернуть изображение.Как получить истинное вращение активности относительно тела устройства

Кажется, что для этого можно использовать Display.getRotation(). Но, видимо, это не может: https://groups.google.com/forum/#!topic/android-developers/ij_0QbApKKc

Проблема в том, что точка происхождения не установлена ​​Android API. Некоторые планшеты возвращают вращение 0 в нормальной ориентации (пейзажные кнопки, кнопки увеличения вверх) и некоторые другие (например, мой Nexus 7 2013). Возврат 1.

Как решить эту проблему?

+0

Может также обновить вопросы название и содержание, что неясно, что вы хотите. Вращение или ориентация. – Simas

+0

Трудно понять, о чем вы спрашиваете. Но похоже, что вам просто нужно знать, работаете ли вы в портретном или ландшафтном режиме. Это легко сделать, сравнивая ширину/высоту экрана. Если высота> ширина, то она находится в портретном режиме, иначе она находится в ландшафтном режиме. –

+0

@GregMiller: Извините, я не понимал, что мой английский так плохо. Не знаю, как еще сформулировать вопрос. Нет, вы ошибаетесь, это не то, что я имею в виду. Это не мой первый год разработки Android, и мне, конечно, не нужно было задавать новый вопрос для чего-то такого простого, не говоря уже о том, чтобы выделить щедрость. Короче: мне нужно именно то, что делает 'Display.getRotation()'. Не больше, не меньше. Проблема в том, что 'Display.getRotation()' не работает, и точный способ, которым это не работает, описано в вопросе. –

ответ

1

Вы можете детерминированным ориентацию с помощью OrientationEventListener что-то просто, как этот

mOrientationEventListener = new OrientationEventListener(context, SensorManager.SENSOR_DELAY_NORMAL) { 

      @Override 
      public void onOrientationChanged(int orientation) { 

       // determine our orientation based on sensor response 

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

       if (display.getOrientation() == Surface.ROTATION_0) { // landscape oriented devices 
        isLandscapeOriented = true; 
        if (orientation >= 315 || orientation < 45) { 
         if (mOrientation != ORIENTATION_LANDSCAPE_NORMAL) {       
          mOrientation = ORIENTATION_LANDSCAPE_NORMAL; 
         } 
        } else if (orientation < 315 && orientation >= 225) { 
         if (mOrientation != ORIENTATION_PORTRAIT_INVERTED) { 
          mOrientation = ORIENTATION_PORTRAIT_INVERTED; 
         }      
        } else if (orientation < 225 && orientation >= 135) { 
         if (mOrientation != ORIENTATION_LANDSCAPE_INVERTED) { 
          mOrientation = ORIENTATION_LANDSCAPE_INVERTED; 
         }      
        } else if (orientation <135 && orientation > 45) { 
         if (mOrientation != ORIENTATION_PORTRAIT_NORMAL) { 
          mOrientation = ORIENTATION_PORTRAIT_NORMAL; 
         }      
        }      
       } else { // portrait oriented devices 

        if (orientation >= 315 || orientation < 45) { 
         if (mOrientation != ORIENTATION_PORTRAIT_NORMAL) {       
          mOrientation = ORIENTATION_PORTRAIT_NORMAL; 
         } 
        } else if (orientation < 315 && orientation >= 225) { 
         if (mOrientation != ORIENTATION_LANDSCAPE_NORMAL) { 
          mOrientation = ORIENTATION_LANDSCAPE_NORMAL; 
         }      
        } else if (orientation < 225 && orientation >= 135) { 
         if (mOrientation != ORIENTATION_PORTRAIT_INVERTED) { 
          mOrientation = ORIENTATION_PORTRAIT_INVERTED; 
         }      
        } else if (orientation <135 && orientation > 45) { 
         if (mOrientation != ORIENTATION_LANDSCAPE_INVERTED) { 
          mOrientation = ORIENTATION_LANDSCAPE_INVERTED; 
         }      
        } 
       } 


      } 
     }; 
    } 
    if (mOrientationEventListener.canDetectOrientation()) { 
     mOrientationEventListener.enable(); 
    } 

Не забудьте позвонить mOrientationEventListener.disable();

EDIT:

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 result; 
    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
     result = (info.orientation + degrees) % 360; 
     result = (360 - result) % 360; // compensate the mirror 
    } else { // back-facing 
     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; 
     } 
     result = (info.orientation - degrees + 360) % 360; 
    } 
    camera.setDisplayOrientation(result); 
} 
+0

Когда мне следует называть 'disable', и что произойдет, если я этого не сделаю? –

+0

Кроме того, ваш код является неполным. Где я устанавливаю этот слушатель? Какой датчик, как его запустить? –

+0

На самом деле вам не нужно устанавливать этот прослушиватель anywere - mOrientationEventListener.enable() должно быть достаточно. Это можно сделать в своей деятельности. Я могу включить это в onCreate и отключить в onDestroy. И не вызывать disable - это плохая практика, потому что экземпляр mOrientationEventListener займет ваши ресурсы памяти, пока приложение не будет закрыто. –

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

  • Нет связанных вопросов^_^