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

55

Я хотел бы узнать подробную ориентацию устройства, предпочтительно одного из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   ответов
89

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

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;
}

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

Error: User Rate Limit Exceeded Zoltán
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
-1

Решает ли это вашу проблему?

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
}
Error: User Rate Limit Exceeded Zoltán
7

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Zoltán
1

Вы можете сделать это очень простым способом: получить экранwidhtа такжеheight. screen width will be always higher when device is in landscape orientation.

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();
    }
Error: User Rate Limit Exceeded Zoltán
20

Простой подход будет использовать

getResources().getConfiguration().orientation

1 для Potrait и 2 для Landscape.

Error: User Rate Limit Exceeded Zoltán
2

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Zoltán
15
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;
      }
Error: User Rate Limit Exceeded
7

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

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

            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;
                }
            }
Error: User Rate Limit Exceeded Zoltán

Похожие вопросы