安卓检测手机抬起动作

4

我希望在用户将手机从平面上拿起时执行某些活动。目前我使用检测手机加速度计的摇晃动作的方法,使用以下代码:

sensorMan = (SensorManager) getSystemService(SENSOR_SERVICE);
        accelerometer = sensorMan.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

sensorMan.registerListener(this, accelerometer, SensorManager.SENSOR_STATUS_ACCURACY_HIGH);

public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            mGravity = event.values.clone();
            // Shake detection
            float x = mGravity[0];
            float y = mGravity[1];
            float z = mGravity[2];

            mAccelLast = mAccelCurrent;
            mAccelCurrent = FloatMath.sqrt(x * x + y * y + z * z);
            float delta = mAccelCurrent - mAccelLast;
            mAccel = mAccel * 0.9f + delta;

            if (mAccel > 0.9) {
                //Perform certain tasks.
            }
        }

我遇到的问题是,即使手机还放在平面上,有时候也会达到0.9f的阈值。我尝试记录mAccel的值,并发现即使没有接触手机,它的值也会从9.0到0.4波动。是否有可靠的方法来检测手机的举起动作?

2个回答

4
解决了这个问题。我想做的就是检查问题中所述的“Y”值,并检查该值是否大于1.0。
请注意,如果手机保持垂直姿势,Y始终约为9.8,但在这种情况下,您可以检查X。在我的情况下,用户必须将手机抬起来,然后他会倾斜手机,因此我检查了if(y> = 1.0 && y <= 2.0);
编辑:更新代码
    @Override
public void onSensorChanged(SensorEvent event) {
    try {
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            mGravity = event.values.clone();
            // Shake detection
            float x = mGravity[0];
            float y = mGravity[1];
            float z = mGravity[2];

            float yAbs = Math.abs(mGravity[1]);

            mAccelLast = mAccelCurrent;
            mAccelCurrent = FloatMath.sqrt(x * x + y * y + z * z);
            float delta = mAccelCurrent - mAccelLast;
            mAccel = mAccel * 0.9f + delta;

            if (yAbs > 2.0 && yAbs < 4.0 && !isAlerted() && !isCallActive()) {
                alert();
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

好的,这并不被鼓励。你应该花些心思去做那件事。无论如何,已经更新了。 - Rajkiran
对于那些正在关注我的答案的人,请也在Micromax手机上检查您的应用程序。我曾经遇到过一些问题。Micromax传感器校准不太好。 - Rajkiran

2
我会将陀螺仪也加入检测程序中。
当手机加速并从x=0 y=0 z=0上升到,比如y=120,这就是触发器。
点击这里以获取如何使用它的信息。
另一个用于提升检测的传感器是接近传感器,当手机放在桌子上时距离为0,如果拿起来,该值会迅速上升。

这对 @Michele 没有太大帮助,因为许多手机不支持陀螺仪。此外,即使接近传感器上有一些盖子,距离也将为0。还是谢谢。 - Rajkiran

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