当用户从平坦的表面抬起手机时,我想进行一些活动。我现在使用的方法是使用手机的加速度计使用以下代码检测摇动:
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,即使手机甚至没有被触摸也是如此。有没有保证检测手机升降机芯的方法?
答案 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)