我有一个代码片段来检测加速度计的运动。有时它可以通过正确检测轻微的运动来工作,但有时当我保持设备空闲时它也会检测到运动。 Android 上的内置加速度计检测是否存在问题?
我使用 HTC G-1 设备。我的代码片段如下。如何解决该问题,以便我可以检测到设备的微小移动,但在设备空闲时检测不到任何内容?
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;
}
}
}
以下是一些代码差异...
更新可能有问题last_x
, last_y
, and last_z
。我相信他们应该被包括在内inside the if ((curTime - lastUpdate) > 100) {
陈述。换句话说,它们每次都会更新onSensorChanged
被调用,不是每 100 毫秒调用一次。您可能应该将这三个变量的更新移到它们上方的大括号中。
-
在您计算的行上speed
,公式结尾为... / diffTime * 10000;
你想乘以diffTime
乘以 10000,还是整个结果?自从/
and *
通常具有相同的运算符优先级 http://en.wikipedia.org/wiki/Order_of_operations在我所知道的大多数语言中(例如Java http://www.cs.uwf.edu/~eelsheik/cop2253/resources/op_precedence.html),您的方程将从左到右计算,首先除以diffTime
then将该结果乘以 10000。
我猜你的意思是乘以diffTime
10000,因此dividing最终结果就是这个金额。这是除以 10000 或乘以 10000 之间的差异,这意味着您可能会得到以下值speed
比您应有的值大 10^8,因此即使在设备空闲时也会触发您的阈值。您需要在乘法两边加上括号,例如... / (diffTime * 10000);
,以确保其执行before分裂发生。
此外,如果您打算扩展diffTime
从毫秒到秒,比例因子应该是 1000。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)