锁定屏幕方向

5
我正在制作一个应用程序,可以让您阅读维基百科页面。
我想在每次手机从竖屏切换到横屏或反之时显示一个图标。如果用户希望锁定屏幕方向,则可以执行此操作;否则,屏幕将根据传感器数据进行定位。谷歌应用商店中的一些应用程序已经实现了这个功能,例如 Pocket。
为了实现这个功能,我重写了

标签。
public void onConfigurationChanged(Configuration newConfig)

现在,如果我使用以下代码设置了锁定配置(orientation_dir是存储在共享首选项中的方向值,并且它是正确的,因为我已经通过代码进行了调试):

if(orientation_dir == Configuration.ORIENTATION_LANDSCAPE)
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
        }
        else if(orientation_dir == Configuration.ORIENTATION_PORTRAIT)
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
        }

如果正确设置方向,则在旋转手机时不会调用onConfigurationChanged()方法。

如果我以这种方式设置方向:

if(orientation_dir == Configuration.ORIENTATION_LANDSCAPE)
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }
        else if(orientation_dir == Configuration.ORIENTATION_PORTRAIT)
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}

如果没有设置期望的方向,则手机将根据传感器数据重置方向。

我尝试过在方法中不调用super,因为我认为它可能会设置错误,但是这样会导致异常“未调用Super”。

我已经尝试了两天,还没有找到解决这个问题的方法。


那么问题是什么?您希望在屏幕方向发生更改时调用onConfigurationChanged()事件,尽管存在您提到的锁定吗? - 10s
我希望每当手机方向改变时,它都会被调用。 - jeevs
2个回答

5
一般情况下,onConfigurationChanged()事件只有在发生配置更改时才会触发。在您的应用程序中,仅当屏幕可以自由旋转时才会发生方向更改事件。如果锁定了屏幕方向,则不会触发屏幕方向事件。onConfigurationChanged()不监听负责旋转设备的传感器,而是仅在适当的事件发生时触发。

因此,您真正想要的是访问SensorManager并附加SensorListener。这是您监听设备实际方向的方法。

以下是一个非常好的演示,演示了手机方向与SensorManager功能:

http://www.workingfromhere.com/blog/2009/03/30/orientation-sensor-tips-in-android/

更新:方向传感器是一个组合传感器,使开发者的工作更加简单。它实际上并不存在于手机中。这是一个非常棒的传感器,结合了加速度计和磁场传感器。根据文档,OrientationSensor目前已被弃用(http://developer.android.com/guide/topics/sensors/sensors_position.html)。

请参见android方向传感器的替代方案是什么?以获取示例用法。

可能需要一些修复,我没有测试过它的稳定性。


是的,我必须使用旋转传感器或重力+地磁传感器来完成它。但现在出现了一个新问题,我的手机上只有加速度计+重力+线性加速度+接近传感器+光传感器。因此,我无法使用库方法来计算方向,因为我没有旋转传感器或地磁传感器。所以,有人可以帮助我使用上述可用传感器计算方向吗? - jeevs
谢谢,但我已经在开发者文档中看到了这段代码,它需要磁力计,而我的手机(HTC Explorer)没有磁力计。因此,我需要使用加速度计来计算方向。 - jeevs
也许你应该关闭并确认这个话题,并添加另一个话题,因为现在的问题已经改变,进入了一个不同的新水平。我认为,仅使用加速度计来实现方向变化并不容易,不幸的是,我没有做过类似的事情,从现在开始无法再帮助你了。 - 10s

0

onConfigurationChanged - 是一种通知,用于让您的活动了解方向的更改。

您不应尝试在该方法中更改或修复方向。如果将方向设置为横向或纵向,则不会收到新的方向更改通知,因为活动的方向不会更改。也许您应该在小部件的事件处理程序中设置方向设置,以便在方向更改时显示计划显示的小部件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接