【发布时间】:2009-10-27 13:31:19
【问题描述】:
我有一个代码 sn-p 来检测加速度计的运动。它有时会通过正确检测轻微运动来工作,但有时它也会在我让设备闲置时检测到运动。 Android 上的内置加速度计检测是否存在任何问题?
我使用 HTC G-1 设备。我的代码 sn-p 如下。如何解决这个问题,以便在设备空闲时检测到设备的小动作但检测不到任何东西?
private static final int SHAKE_THRESHOLD = 50;
public void onSensorChanged(int sensor, float[] values) {
if (sensor == SensorManager.SENSOR_ACCELEROMETER) {
long curTime = System.currentTimeMillis();
// only allow one update every 100ms.
if ((curTime - lastUpdate) > 100) {
long diffTime = (curTime - lastUpdate);
lastUpdate = curTime;
x = values[SensorManager.DATA_X];
y = values[SensorManager.DATA_Y];
z = values[SensorManager.DATA_Z];
float speed = Math.abs(x+y+z - last_x - last_y - last_z) / diffTime * 10000;
if (speed > SHAKE_THRESHOLD) {
long curTime = System.currentTimeMillis();
long diff = (curTime - shakeTime);
shakeTime = curTime;
if (myFlagIgnoreShakeDetection==true) //Caused unneccessary accelerometer
//notification looping when device is idle
return;
// Doing something...
}
last_x = x;
last_y = y;
last_z = z;
}
}
}
【问题讨论】:
-
您可能想要对加速度进行适当的矢量加法:jerk = Math.sqrt(Math.pow(x-last_x, 2) + Math.pow(y-last_y, 2) + Math.pow(y-last_y, 2) pow(z-last_z, 2)) / diffTime * 10000;否则,0.29 m/s^2 的加速度变化将触发您的阈值。
-
我更改了代码 sn-p 上的缩进,以更好地说明左大括号和右大括号的位置。
-
另一个问题...
lastUpdate、shakeTime、last_x、last_y和last_z在某处初始化?它们有哪些初始值? -
私有浮点 x, y, z;私人浮动last_x,last_y,last_z;长摇时间=-1;私有的 long lastUpdate = -1;
-
最后我能够理解是什么导致了问题,但在 HTC 设备上进行测试时发现它,而不是通过代码。当我使用该设备一段时间然后将其闲置时,它在场景中按预期工作(没有错误事件)。场景是,我需要让设备稍微移动(在我的桌子上稍微用力)以保持空闲状态,然后它会停止通知错误事件。否则,如果我将设备闲置而不在桌子上移动(非常缓慢),那么加速度计也会继续通知我的应用程序,这会导致错误事件。现在对我的代码有什么建议吗?
标签: android accelerometer