如何通过传感器确定设备方向

3

我的活动锁定在LANDSCAPE模式。但我仍然需要了解设备的方向。因此,我选择使用传感器。我有以下代码:

sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_NORMAL);
...
@Override
  public void onSensorChanged(SensorEvent event) {
    float[] values = event.values;

    // Movement
    float azimuth = values[0];
    float pitch = values[1];
    float roll = values[2];

    if ((-110 <= pitch && pitch <= -70) || (70 <= pitch && pitch <= 110)) {
      //PORTRAIT MODE
      portraitPitch = true;
      landscapePitch = false;
      Log.d(TAG, "portrait mode: pitch = " + pitch);
    } else if ((-20 <= pitch && pitch <= 20) || (-200 <= pitch && pitch <= -160) || (160 <= pitch && pitch <= 200)) {
      //LANDSCAPE MODE
      portraitPitch = false;
      landscapePitch = true;
      Log.d(TAG, "landscape mode : pitch = " + pitch);
    }

    if ((-20 <= roll && roll <= 20)) {
      //PORTRAIT MODE
      portraitRoll = true;
      landscapePitch = false;
      Log.d(TAG, "portrait mode: roll = " + roll);
    } else if ((-110 <= roll && roll <= -70) || (70 <= roll && roll <= 110)) {
      //LANDSCAPE MODE
      portraitRoll = false;
      landscapePitch = true;
      Log.d(TAG, "landscape mode : roll = " + roll);
    }

    if (portraitPitch && portraitRoll && !portrait) {
      portrait = true;
      landscape = false;
      rotateIconsToPortraitMode();
      Log.d(TAG, "portrait mode for icons: pitch = " + pitch + ", roll = " + roll);
    }

    if (landscapePitch && landscapeRoll && !landscape) {
      landscape = true;
      portrait = false;
      rotateIconsToLandscapeMode();
      Log.d(TAG, "landscape mode for icons: pitch = " + pitch + ", roll = " + roll);
    }
}

我的代码不能可靠地工作,事实上,otateIconsToLandscapeMode()从未被调用。

如何利用有关方位角俯仰角滚动角的信息来确定设备的纵向或横向方向?我希望我的问题足够具体,以便得到具体的答案。谢谢。


你试过自己处理配置更改吗?在清单文件中添加configChanges: orientation,并实现onConfigurationChanged,然后也许你可以获取newConfig.orientation - undefined
那不起作用。一旦方向被锁定,配置更改事件就没有意义了。你必须使用传感器。 - undefined
我建议您访问 https://dev59.com/WF4c5IYBdhLWcg3wuMN7 - undefined
2个回答

9
在 `onCreate` 中实例化一个 `OrientationEventListener`。
OrientationEventListener orientationEventListener = new OrientationEventListener(this)
    {
        @Override
        public void onOrientationChanged(int orientation)
        {
            Log.d(TAG, "orientation = " + orientation);
        }
    }; 

    orientationEventListener.enable();

利用方向值,您可以确定设备是处于纵向还是横向。


1
这正是我所需要的..:) - undefined
非常清晰简单易用。谢谢! - undefined

1

如果你只需要横向或纵向方向,那么俯仰值就足够了。根据你具体的需求,它可能不完美。但根据我的理解,你可以简单地使用俯仰角。所以你可以按照原来的方式进行操作,忽略滚动。


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