Как получить ориентацию CURRENT (ActivityInfo.SCREEN_ORIENTATION_ *) устройства Android?

Я хотел бы узнать подробную ориентацию устройства, предпочтительно одного из SCREEN_ORIENTATION_LANDSCAPE , SCREEN_ORIENTATION_PORTRAIT , SCREEN_ORIENTATION_REVERSE_LANDSCAPE , SCREEN_ORIENTATION_REVERSE_PORTRAIT из ActivityInfo или эквивалентного.

Некоторые ответы здесь на StackOverflow включены

 getWindowManager().getDefaultDisplay().getRotation() 

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

 getResources().getConfiguration().orientation 

Возвращает одно из следующих трех: ORIENTATION_LANDSCAPE , ORIENTATION_PORTRAIT , ORIENTATION_SQUARE , которое на самом деле не говорит мне, каким образом телефон поворачивается (будь то вверх дном или с той стороны, к которой он обращен).

Я знаю, что смогу использовать последний в сочетании с DisplayMetrics чтобы узнать естественную ориентацию устройства, но нет ли лучшего способа?

Solutions Collecting From Web of "Как получить ориентацию CURRENT (ActivityInfo.SCREEN_ORIENTATION_ *) устройства Android?"

Я закончил использование следующего решения:

 private int getScreenOrientation() { int rotation = getWindowManager().getDefaultDisplay().getRotation(); DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int width = dm.widthPixels; int height = dm.heightPixels; int orientation; // if the device's natural orientation is portrait: if ((rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) && height > width || (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) && width > height) { switch(rotation) { case Surface.ROTATION_0: orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; break; case Surface.ROTATION_90: orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; break; case Surface.ROTATION_180: orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; break; case Surface.ROTATION_270: orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; break; default: Log.e(TAG, "Unknown screen orientation. Defaulting to " + "portrait."); orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; break; } } // if the device's natural orientation is landscape or if the device // is square: else { switch(rotation) { case Surface.ROTATION_0: orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; break; case Surface.ROTATION_90: orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; break; case Surface.ROTATION_180: orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; break; case Surface.ROTATION_270: orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; break; default: Log.e(TAG, "Unknown screen orientation. Defaulting to " + "landscape."); orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; break; } } return orientation; } 

ПРИМЕЧАНИЕ . Некоторые пользователи (Geltrude и holtaf в комментариях ниже) указали, что это решение не будет работать на всех устройствах, так как направление вращения из естественной ориентации не стандартизировано.

 public static int getScreenOrientation(Activity activity) { int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); int orientation = activity.getResources().getConfiguration().orientation; if (orientation == Configuration.ORIENTATION_PORTRAIT) { if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270) { return ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; } else { return ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; } } if (orientation == Configuration.ORIENTATION_LANDSCAPE) { if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90) { return ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; } else { return ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; } } return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; } 

Простым подходом было бы использование

 getResources().getConfiguration().orientation 

1 для Potrait и 2 для пейзажа.

getResources().getConfiguration().orientation – это стандартный способ узнать, getResources().getConfiguration().orientation текущая ориентация используется. Однако, если он не удовлетворяет вашим потребностям, возможно, вы можете использовать датчики для расчета его с точки зрения угла. Прочтите это и это

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

Попробуйте это, я думаю, это может решить вашу проблему.

  int orientation = getResources().getConfiguration().orientation; int rotation = getWindowManager().getDefaultDisplay().getRotation(); int actual_orientation = -1; if (orientation == Configuration.ORIENTATION_LANDSCAPE && (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90)){ orientation = Configuration.ORIENTATION_LANDSCAPE; } else if (orientation == Configuration.ORIENTATION_PORTRAIT && (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90)) { orientation = Configuration.ORIENTATION_PORTRAIT; } else if (orientation == Configuration.ORIENTATION_LANDSCAPE && (rotation == Surface.ROTATION_180 || rotation == Surface.ROTATION_270)){ orientation = //any constant for reverse landscape orientation; } else { if (orientation == Configuration.ORIENTATION_PORTRAIT && (rotation == Surface.ROTATION_180 || rotation == Surface.ROTATION_270)){ orientation = //any constant for reverse portrait orientation; } } 

Я закончил использовать ответ Zoltán выше, который отлично работает, если только я не попробовал его на планшете (Samsung P6210 Galaxy Tab 7.0 Plus). В портретном режиме он вернул SCREEN_ORIENTATION_REVERSE_PORTRAIT. Таким образом, в заявлении else (если естественная ориентация является ландшафтной), я менял местами для ROTATION_90 и ROTATION_270, и все, кажется, работает нормально. (У меня недостаточно репутации, чтобы опубликовать это как комментарий к ответу Золтана).

Вы можете сделать это очень простым способом: получить экран widht и height . Ширина экрана будет всегда выше, если устройство находится в альбомной ориентации.

 Display display = getWindowManager().getDefaultDisplay(); int width = display.getWidth(); int height = display.getHeight(); Toast.makeText(getApplicationContext(), "" + width + "," + height, Toast.LENGTH_SHORT).show(); if (width > height) { Toast.makeText(getApplicationContext(), "LandScape", Toast.LENGTH_SHORT).show(); } 

Помогает ли это решить вашу проблему?

 public static int getscrOrientation(Activity act) { Display getOrient = act.getWindowManager() .getDefaultDisplay(); int orientation = getOrient.getOrientation(); // Sometimes you may get undefined orientation Value is 0 // simple logic solves the problem compare the screen // X,Y Co-ordinates and determine the Orientation in such cases if (orientation == Configuration.ORIENTATION_UNDEFINED) { Configuration config = act.getResources().getConfiguration(); orientation = config.orientation; if (orientation == Configuration.ORIENTATION_UNDEFINED) { // if height and widht of screen are equal then // it is square orientation if (getOrient.getWidth() == getOrient.getHeight()) { orientation = Configuration.ORIENTATION_SQUARE; } else { // if widht is less than height than it is portrait if (getOrient.getWidth() < getOrient.getHeight()) { orientation = Configuration.ORIENTATION_PORTRAIT; } else { // if it is not any of the above it will defineitly // be landscape orientation = Configuration.ORIENTATION_LANDSCAPE; } } } } return orientation; // return value 1 is portrait and 2 is Landscape // Mode }