gpt4 book ai didi

java - OnSensorChanged 被调用的次数超过预期

转载 作者:太空狗 更新时间:2023-10-29 13:49:44 25 4
gpt4 key购买 nike

我正在尝试开发一个检测跌倒的应用程序,到目前为止,跌倒的准确性在可接受的范围内,但问题是“OnSensorChanged”的调用过于频繁,导致 toast 不断出现在我的屏幕上.

我认为问题在于,在自由落体期间,“OnSensorChanged”在下降期间不断被调用(因为值对应于下降),这导致我的屏幕上出现 toast 垃圾信息。

我尝试的解决方案是在跌倒后注销监听器,这样它只出现一次,但问题是除非我重新启动应用程序,否则它不会再次检测到跌倒(因为显然监听器停止工作)。

这个问题有什么解决办法吗?谢谢

private void checkFall(SensorEvent xyzValues) {
float[] values = xyzValues.values;
double rootSquare = Math.sqrt(Math.pow(values[0],2)+Math.pow(values[1],2)+Math.pow(values[2],2));

if (rootSquare < 1.5){

Toast toast = Toast.makeText(this, "The Phone Fell!", Toast.LENGTH_LONG);
toast.show();
sensorManager.unregisterListener(this);
sensorManager = null;


}
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
checkFall(event);

}
}

最佳答案

您可以使用成员 boolean 变量 mFallen 来跟踪坠落何时发生。您可能还想定义一些阈值来指示电话何时恢复到正常的“站立”状态。尝试以下操作:

    if (rootSquare < 1.5 && !mFallen){
Toast toast = Toast.makeText(this, "The Phone Fell!", Toast.LENGTH_LONG);
toast.show();
mFallen = true;
} else if (rootSquare > STANDING_THRESHOLD) {
mFallen = false;
}

更好的标准检测算法

一旦 mFallen 的状态从 false 变为 true,设备加速度 vector 的大小(如您计算并存储在 rootSquare 中)应该非常接近于 0。这是因为当设备处于自由落体状态(完全自行下落)时,其加速度将是来自站立人员引用系的重力加速度。但理论上,加速度计只会测量相对于自由落体的值,因此它恰好为 0。

由于重力加速度约为 9.81 m/s^2,要检测设备何时不再移动,您需要检查加速度大小何时接近该值。这是因为当静止不动时,传感器将检测到阻止它掉落的力(抵消重力加速度),这是使它保持静止的任何力量。在这种情况下,由这些力引起的加速度的总大小必须恰好与由重力引起的加速度的大小相加。

你可以定义一个常量 GRAVITY9.81GRAVITY_THRESHOLD 为一个公差值,你可以尝试将其设置为 0.1 然后再细化。尝试用以下代码替换您的代码:

if (rootSquare < 1.5 && !mFallen){
Toast toast = Toast.makeText(this, "The Phone Fell!", Toast.LENGTH_LONG);
toast.show();
mFallen = true;
} else if (Math.abs(rootSquare - GRAVITY) < GRAVITY_THRESHOLD) {
mFallen = false;
}

强调一下,这里定义的站立状态是只有当设备停止移动时,所以当手机相对于手机到达一定高度时,它就无法检测到地面。

请参阅https://developer.android.com/reference/android/hardware/SensorEvent.html#values ,因为它可以帮助您更好地理解问题。

关于java - OnSensorChanged 被调用的次数超过预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49714207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com