Как мне получить текущую ориентацию (ActivityInfo.Ориентация экрана*) устройства 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
чтобы узнать естественную ориентацию устройства, но действительно ли нет лучшего способа?
8 ответов:
в итоге я использовал следующее решение:
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 в комментариях ниже) отметили, что это решение не будет работать на всех устройствах, поскольку направление вращения от естественной ориентации не стандартизировано.
простой подход будет использовать
getResources().getConfiguration().orientation
1 для Potrait и 2 для ландшафта.
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; }
Я думаю, что ваша проблема заключается в том, что вы можете обнаружить пейзаж и портрет, но не обратный пейзаж и портрет обратного, поскольку они не поддерживаются в старых версиях. Чтобы определить, что вы можете сделать, вы можете использовать как oreintation, так и вращение. Я даю вам идею, что это может быть полезно для вас.
попробуйте это, я думаю, это может решить вашу проблему.
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; } }
Я закончил тем, что использовал ответ Золтана выше, который отлично работает, за исключением того, когда я попробовал его на планшете (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 }