Check orientation on Android phone Check orientation on Android phone android android

Check orientation on Android phone


The current configuration, as used to determine which resources to retrieve, is available from the Resources' Configuration object:

getResources().getConfiguration().orientation;

You can check for orientation by looking at its value:

int orientation = getResources().getConfiguration().orientation;if (orientation == Configuration.ORIENTATION_LANDSCAPE) {    // In landscape} else {    // In portrait}

More information can be found in the Android Developer.


If you use getResources().getConfiguration().orientation on some devices you will get it wrong. We used that approach initially in http://apphance.com. Thanks to remote logging of Apphance we could see it on different devices and we saw that fragmentation plays its role here. I saw weird cases: for example alternating portrait and square(?!) on HTC Desire HD:

CONDITION[17:37:10.345] screen: rotation: 270 orientation: squareCONDITION[17:37:12.774] screen: rotation: 0 orientation: portraitCONDITION[17:37:15.898] screen: rotation: 90CONDITION[17:37:21.451] screen: rotation: 0CONDITION[17:38:42.120] screen: rotation: 270 orientation: square

or not changing orientation at all:

CONDITION[11:34:41.134] screen: rotation: 0CONDITION[11:35:04.533] screen: rotation: 90CONDITION[11:35:06.312] screen: rotation: 0CONDITION[11:35:07.938] screen: rotation: 90CONDITION[11:35:09.336] screen: rotation: 0

On the other hand, width() and height() is always correct (it is used by window manager, so it should better be). I'd say the best idea is to do the width/height checking ALWAYS. If you think about a moment, this is exactly what you want - to know if width is smaller than height (portrait), the opposite (landscape) or if they are the same (square).

Then it comes down to this simple code:

public int getScreenOrientation(){    Display getOrient = getWindowManager().getDefaultDisplay();    int orientation = Configuration.ORIENTATION_UNDEFINED;    if(getOrient.getWidth()==getOrient.getHeight()){        orientation = Configuration.ORIENTATION_SQUARE;    } else{         if(getOrient.getWidth() < getOrient.getHeight()){            orientation = Configuration.ORIENTATION_PORTRAIT;        }else {              orientation = Configuration.ORIENTATION_LANDSCAPE;        }    }    return orientation;}


Another way of solving this problem is by not relying on the correct return value from the display but relying on the Android resources resolving.

Create the file layouts.xml in the folders res/values-land and res/values-port with the following content:

res/values-land/layouts.xml:

<?xml version="1.0" encoding="utf-8"?><resources>    <bool name="is_landscape">true</bool></resources>

res/values-port/layouts.xml:

<?xml version="1.0" encoding="utf-8"?><resources>    <bool name="is_landscape">false</bool></resources>

In your source code you can now access the current orientation as follows:

context.getResources().getBoolean(R.bool.is_landscape)