如何使用传感器获取手机的角度/度数?

7

我正在尝试使用TYPE_ACCELEROMETER传感器获取手机角度。 我的目标是在手机倾斜后仅获取角度值。 它可以工作,但问题是, 当我将手机朝上放在桌子上时, 它仍然显示isLandscape = true;

private boolean isLandscape;

mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
mSensorManager.registerListener(mSensorListener, mSensorManager.getDefaultSensor(
                                          Sensor.TYPE_ACCELEROMETER),1000000);
private final SensorEventListener mSensorListener = new SensorEventListener() { 
    @Override
    public void onSensorChanged(SensorEvent mSensorEvent) {  
        float X_Axis = mSensorEvent.values[0];
        float Y_Axis = mSensorEvent.values[1];
        double angle = Math.atan2(X_Axis, Y_Axis)/(Math.PI/180);

        if(!isLandscape) {                  
            if(angle > 80) {
                Orientation = 90;
                isLandscape = true;
            }
        }
        else 
        {

            if(Math.abs(angle) < 10) {
                Orientation = 0;  //portrait
                isLandscape = false;
            }
        }
    }

    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
};

什么是获取手机角度仅在手机倾斜后的最佳方法? 对于糟糕的英语,我感到抱歉。 谢谢。

我不太明白你的目标。也许可以考虑使用加速度计来检测手机位置何时发生变化,然后使用重力传感器来确定其方向在变化停止后的状态。 - Bob Snyder
我关心在使用两个不同的传感器时电池消耗情况。相较于使用一个传感器,使用两个不同的传感器会对电池消耗造成多大影响? - IYM-14
我不知道。我假设您正在活动中进行此处理,并且只有在活动可见时才注册传感器。 - Bob Snyder
2个回答

7
我不确定我是否理解了你的问题,但我认为你希望你的应用程序仅在手机处于竖屏状态时计算倾斜角度。首先,您需要获取mSensorEvent.values [0]的值,在这种情况下,如果手机处于立式状态,则会返回0,向右倾斜将是从1到9的负值,向左则是正值。
然后,您必须在mSensorEvent.values [1]值在例如9和7之间的情况下执行所有这些操作(9是完美的立式),以确保设备处于竖屏位置。
如果您需要度数角度值,则可以将mSensorEvent.values的浮点值乘以10。
希望这能帮助你
更新***
你可以尝试这个:
    private boolean isLandscape;

    @Override 
    public void onSensorChanged(SensorEvent mSensorEvent) {   
        float X_Axis = mSensorEvent.values[0]; 
        float Y_Axis = mSensorEvent.values[1]; 

        if((X_Axis <= 6 && X_Axis >= -6) && Y_Axis > 5){
        isLandscape = false; 
        }
        else if(X_Axis >= 6 || X_Axis <= -6){
        isLandscape = true;
        }

    } 

我想要的只是获取倾斜角度(纵向或横向),而无需使用屏幕旋转功能。我正在尝试创建一个相机应用程序,所以我有一些图标,我希望它们在手机倾斜到横向/纵向时进行旋转和平移。因此,我想我可以通过传感器来实现这一点。 - IYM-14
我现在的代码不正确,因为它说isLandscape = true;即使我把手机垂直放在桌子上而没有倾斜。 - IYM-14
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Khalil Tam
我刚刚测试了一下,这正是我想要的,谢谢! - IYM-14
我正在看这段代码,不禁想到一个问题。当用户只是把手机倾斜到两侧时,这段代码可以很好地工作。但如果用户以足够的力量快速水平移动手机,使得X值超过6或低于-6,那么它也会“起作用”,因为加速度计考虑了线性力。你如何解决这个问题? - Bojje

2

不需要为ACCELEROMETER传感器注册,只需拥有一个OrientationEventListener类型的类成员即可。当设备平放时,应该会得到OrientationEventListener.ORIENTATION_UNKNOWN

请参见Android landscape right to landscape left event了解如何创建一个OrientationEventListener类成员。

或者您可以保留原来的代码,同时检查设备的倾斜度。如果设备是平放的,则将isLandscape标志设置为适合您情况的任何值。如何计算设备的倾斜度,请参见How to measure the tilt of the phone in XY plane using accelerometer in Android


谢谢你的评论,Hoan。但是这不是我想要的,因为我的活动将关闭屏幕方向功能。这意味着无论我的手机处于纵向还是横向角度,方向始终是未知的。我不喜欢屏幕方向功能的原因是每次更改方向时都会稍微暂停我的应用程序。 - IYM-14
好的,我修改我的答案。 - Hoan Nguyen
感谢Hoan提供的倾斜法链接,非常感谢! - IYM-14
嘿...我需要在我的Android应用程序中的方向盘控制器上添加此功能...@HoanNguyen...谢谢! - gumuruh

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