This is the class I wrote to handle lock and unlock screen orientation. I call toggleScreenOrientationLock(this, prefs, isChecked) using the switch button checkChangedListener and restoreScreenLock(this, prefs) from onCreate (). In both cases, this is your activity, and prefs is the SharedPrefences object used to store information about the lock state.
The getScreenOrientation() part of the code is the getScreenOrientation() function, which I stole and removed here . I will try to explain the logic of how this works.
When we set the device orientation using setRequestedOrienation() , we need to know if the device is in landscape or portrait mode, and we need to know the reverse orientation (rotated 180 degrees).
Using getResources().getConfiguration().orientation will answer the question of which orientation we are in. If we could influence the rotation of the device, we could determine if it was rotated 180 or not. Unfortunately, depending on the device, ROTATE_0 may be portrait or landscape. Phones typically display ROTATE_0 on a portrait, and tablets on a landscape.
So, the solution used here is to use the size of the screen to determine if it is in a landscape or portrait. If the screen is wider than high, then we conclude that the device is in landscape orientation, and vice versa for portraiture. We can then take the rotation into account to find out if the orientation has changed or not.
For example, if the screen is wider than tall, then we know that we are in landscape orientation. If the rotation is 0 or 180 (in the logic of the code it is! IsRotatedOrthogonally), then we know that 0 is LANDSCAPE, and 180 is REVERSE_LANDSCAPE.
It was noted elsewhere that this will not work on all devices since the 90 or 270 reverse orientation is device specific. But this is still probably the best thing you are going to do; in the worst case, one orientation will rotate 180 degrees when you close it, which is likely to happen if you try to lock the screen in any other way.
public class ScreenLocker { final private static String ROTATION_LOCKED_KEY = "LockedOrientationVal"; final private static String ROTATION_IS_LOCKED_KEY = "IsRotationLocked"; final private static String ROTATION_SAVED_KEY = "SavedOrientationVal"; public static int getScreenOrientation(Activity activity) { final Display display = activity.getWindowManager().getDefaultDisplay(); final int rotation = display.getRotation(); Point size = new Point(); display.getSize(size); final boolean isWiderThanTall = size.x > size.y; final boolean isRotatedOrthogonally = (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270); int orientation; if (isRotatedOrthogonally) { if (isWiderThanTall) orientation = (rotation == Surface.ROTATION_90) ? ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE : ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; else orientation = (rotation == Surface.ROTATION_90) ? ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;