Android determine screen orientation at runtime

Yong Fei picture Yong Fei · Mar 1, 2012 · Viewed 31.8k times · Source

Here's a pseudo code to detect screen rotate event, and decide to retain or changes the screen orientation.

public boolean onOrientationChanges(orientation) {
  if(orientation == landscape)
    if(settings.get("lock_orientation"))
      return false;   // Retain portrait mode
    else
      return true; // change to landscape mode

  return true; 
}

How do I make similar things in Android?

EDIT: I'm actually looking answer on Where to handle orientation changes. I do not want to fix the orientation by adding screenOrientation="portrait".

I need something, similar to onConfigurationChanges(), where I can handle the orientation, but do no need me to manually redraw the view.

Answer

Ogulcan Orhan picture Ogulcan Orhan · Mar 1, 2012

You need a Display instance firstly:

Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

Then orientation may be called like this:

int orientation = display.getOrientation();

Check orientation as your way and use this to change orientation:

setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

I hope it helps.

Update:

Okay, let's say you've an oAllow var which is Boolean and default value is False.

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
    int orientation = display.getOrientation(); 
    switch(orientation) {
        case Configuration.ORIENTATION_PORTRAIT:
            if(!oAllow) {
                    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            }
            break;
        case Configuration.ORIENTATION_LANDSCAPE:
            if(!oAllow) {
                    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
            break;
    }
}

You can add more choices.

I didn't try this sample, but at least tells you some clues about how to solve. Tell me if you got any error.

UPDATE

getOrientation() is already deprecated see here. Instead Use getRotation(). To check if the device is in landscape mode you can do something like this:

Display display = ((WindowManager) getSystemService(WINDOW_SERVICE))
        .getDefaultDisplay();

int orientation = display.getRotation();

if (orientation == Surface.ROTATION_90
        || orientation == Surface.ROTATION_270) {
    // TODO: add logic for landscape mode here            
}