检测设备方向

5

我需要在不手动处理传感器数据的情况下检测安卓设备的方向变化,同时保持活动方向固定在某个方向。

onConfigurationChange 不起作用,因为它会将我的活动固定在不旋转的状态。

我认为通过操纵传感器数据来检测方向变化是一种发明轮子的行为,因为安卓已经嵌入了检测设备方向变化的算法实现。而从另一方面来说,检测方向变化并非像这样简单的检查。

    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将无法工作)


这不是你想要的吗?https://dev59.com/0HE85IYBdhLWcg3wZymt - Archie.bpgc
抱歉,我没有任何可以更改的资源。 - deimus
3个回答

11

谢谢兄弟,这正是我所需要的!!!非常尊重!!!虽然我是Android新手,但似乎很多Android开发人员甚至在stackoverflow上也没有意识到这一点。 - deimus
欢迎Deimus,没有人是完美的,每个人都有自己的专业领域,我只是最近3-5天开始使用SO :) 开心编程 - rajpara

9
通过在清单文件中设置screenOrientation属性,您将无法再从onConfigurationChanged中获取方向值,因为它会停止触发。虽然可以实现SensorEventListener来获取Pitchrollyaw角度以计算方向,但这有点复杂,对于这样的任务而言有些过度。我发现最好的解决方案是使用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();
}

6

我的活动被设置为始终处于竖屏模式。在onCreate函数中加入以下代码。

    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;
            }
        }
    };

这对我帮助很大。当Activity被锁定为某个方向时,但仍需要获取设备位置时,这是正确的方法 :) - Tooroop

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