5

我需要在不手动播放传感器数据的情况下检测 android 设备方向的变化,同时保持活动方向坚持某个方向

onConfigurationChange将无法正常工作,因为我的活动不会旋转。

使用传感器数据来检测方向变化我认为这是轮子的发明,因为 android 已经嵌入了算法的实现来检测设备方向变化。而从另一方面来说,方向变化的检测并不是像这样简单的检查。

    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER || event.values.length < 3) {
            return;
        }
        //getResources().getConfiguration().orientation;
        if (event.values[1] < 6.5 && event.values[1] > -6.5) {
            if (orientation!=1) {
                Log.d("Sensor", "Protrait");
            }
            orientation=1;
        } else {
            if (orientation!=0) {
                Log.d("Sensor", "Landscape");
            }
            orientation=0;
        }
   }

它确实需要真正的数据处理,例如过滤噪音和突然的短暂摇晃/旋转。

那么有什么想法可以使用旧服务检测设备方向吗?(再一次,我会坚持我的活动以某种方向,所以onConfigurationChange不会工作)

4

3 回答 3

11

有一个定向事件的侦听器。

在此处查看文档。

SO问题提到了那个监听器的实现。

此博客中相同的代码示例

我希望这能帮到您

于 2012-06-28T07:12:02.390 回答
9

通过在 Manifest 中设置screenOrientation属性,您将无法再从中获取方向值onConfigurationChanged,因为它会停止发射,可以实现SensorEventListener获取Pitch,rollyaw角度来计算方向,但这有点复杂并且对于这样的任务来说有点过分了。我找到的最佳解决方案是使用OrientationEventListener,以下代码将在方向更改时更新旋转值,根据旋转角度,该值为 0 到 4:

private OrientationEventListener listener;
private int rotation;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    listener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL) {
        @Override
        public void onOrientationChanged(int orientation) {
            rotation = ((orientation + 45) / 90) % 4;
        }
    };
    if (listener.canDetectOrientation()) listener.enable();
    else listener = null; // Orientation detection not supported
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (listener != null) listener.disable();
}
于 2015-08-19T15:20:10.653 回答
6

我的活动设置为始终处于纵向模式。将此代码放在创建上。

    myOrientationEventListener = new OrientationEventListener(this,SensorManager.SENSOR_DELAY_NORMAL) {
        public void onOrientationChanged(int arg0) {
            if (arg0>=315 || arg0<45){
                currentOrientation = Surface.ROTATION_90;
            }else if (arg0>=45 && arg0<135){
                currentOrientation = Surface.ROTATION_180;
            }else if (arg0>=135 && arg0<225){
                currentOrientation = Surface.ROTATION_270;
            }else if (arg0>=225 && arg0<315){
                currentOrientation = Surface.ROTATION_0;
            }
        }
    };
于 2014-01-17T17:43:33.013 回答