Android检测手机提升动作

时间:2014-06-10 10:29:40

标签: android accelerometer

当用户从平坦的表面抬起手机时,我想进行一些活动。我现在使用的方法是使用手机的加速度计使用以下代码检测摇动:

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 个答案:

答案 0 :(得分:2)

解决了这个问题。我想做的就是检查" Y"问题中陈述的值,并检查该值是否大于1.0。

请注意,如果手机保持垂直位置,Y始终为9.8左右,但在这种情况下,您可以检查X.在我的情况下,用户必须拿起电话,有些人他会倾斜电话,所以我检查是否(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();
    }
}

答案 1 :(得分:0)

我也会将陀螺仪添加到检测程序中。

手机变为加速 AND 从x = 0 y = 0 z = 0起,即假y = 120,即触发器。

here 对于Infos如何使用它。

用于提升检测的另一个传感器将是Proximity传感器,当电话平放在桌面上时,实例将为0,如果其拾取该值将快速提升