我正在使用以下代码根据用户偏好设置方向锁定:

 private void doLock(boolean locked) {
     if (locked) {
       int o = getResources().getConfiguration().orientation;
       if (o == Configuration.ORIENTATION_LANDSCAPE)
         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
       else if (o == Configuration.ORIENTATION_PORTRAIT)
         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
     }
     else {
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
     }
 }

它起作用,除了我处于解锁模式(SCREEN_ORIENTATION_SENSOR)且屏幕上正确显示LANDSCAPE(!)的情况外,然后调用doLock(true)并...

而不是将屏幕锁定在其当前(正确的)横向 View 中的LANDSCAPE上,而是锁定为一个上下颠倒的横向 View 。即完全相同,但垂直翻转(y变为-y)。

为什么会这样,如何解决此问题才能解决?

我的最初查询显示,除了常见的两种(portrait)以外,还有quite a few的可能性(包括landscape),但是我的直觉告诉我这个问题可能是device-dependent,因此通过使用它,我可能只为我的手机解决了这个问题,但是不适用于所有其他设备。

是否有办法在所有设备中强制正确的reverseLandscape方向(从landscape切换时)?

为了使此内容更清晰,更容易重现,以下是显示该问题的步骤:
  • 以解锁模式(sensor)在解锁模式(SCREEN_ORIENTATION_SENSOR)中向右旋转手机(顺时针)开始,屏幕正确显示LANDSCAPE(!),
  • 然后调用doLock(true)
  • 而不是将屏幕锁定在其当前(正确)横向 View 中的LANDSCAPE上,而是锁定为上下颠倒横向 View 。即完全相同,但垂直翻转(y变为-y)。
  • 最佳答案

    您所描述的不是错误,而是Android 2.2或更低版本的预期行为。

    @forgivegod提供了一种理论上正确的方法,除了在Android 2.2或更低版本中,即使伪造了screenOrientation.reverseLandscapescreenOrientation.reversePortrait值也无法识别(就像@forgivegod的代码一样)。

    我敢打赌,当您顺时针旋转手机(rotation = 3)而不是逆时针旋转(rotation = 1)时,您会看到此问题。

    尝试使用Android 2.3或更高版本,看看会发生什么。

    10-08 17:56