Как получить ориентацию 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
, чтобы узнать естественную ориентацию устройства, но действительно ли не лучший способ?
Ответы
Ответ 1
В итоге я использовал следующее решение:
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 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 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 в комментариях ниже) указали, что это решение не будет работать на всех устройствах, так как направление вращения из естественной ориентации не стандартизировано.
Ответ 2
Простым подходом было бы использовать
getResources().getConfiguration().orientation
1 для Potrait и 2 для ландшафта.
Ответ 3
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;
}
Ответ 4
getResources().getConfiguration().orientation
- это стандартный способ использования текущей ориентации. Однако, если он не удовлетворяет вашим потребностям, возможно, вы можете использовать датчики для расчета его с точки зрения угла. Прочитайте this и this
Ответ 5
Я думаю, ваша проблема в том, что вы можете обнаружить пейзаж и портрет, но не обратный пейзаж и обратный 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;
}
}
Ответ 6
Я закончил использовать ответ Zoltán выше, который отлично работает, если только я не попробовал его на планшете (Samsung P6210 Galaxy Tab 7.0 Plus). В портретном режиме он вернул SCREEN_ORIENTATION_REVERSE_PORTRAIT. Таким образом, в заявлении else (если естественная ориентация является ландшафтной), я менял местами для ROTATION_90 и ROTATION_270, и все, кажется, работает нормально. (У меня недостаточно репутации, чтобы опубликовать это как комментарий к Zoltán.)
Ответ 7
Вы можете сделать это очень просто:
получить экран 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();
}
Ответ 8
Помогает ли это решить вашу проблему?
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
}