Я пытаюсь разработать приложение, которое обнаруживает падение, и пока что точность падения находится в приемлемом диапазоне, но проблема в том, что "OnSensorChanged" вызывается слишком часто, из-за чего всплывающее уведомление постоянно появляется на моем экране. .
Я думаю, что проблема в том, что во время свободного падения "OnSensorChanged" продолжает вызываться на протяжении всего падения (поскольку значения соответствуют падению), что и вызывает спам всплывающих уведомлений на моем экране.
Решение, которое я пробовал, состоит в том, чтобы отменить регистрацию слушателя после падения, чтобы он появлялся только один раз, но проблема в том, что он не обнаружит падение снова, пока я не перезапущу приложение (потому что, очевидно, слушатель перестал работать).
Есть ли решение этой проблемы? Спасибо
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);
}
}
Спасибо!! Кажется, это имеет смысл и должно работать, попробую, когда буду дома, и сообщу о результатах: D
Нет проблем, и я просто обновил код для большей читабельности. Кстати, убедитесь, что вы инициализируете mFallen значением false.
Извините, по какой-то причине мой комментарий не был опубликован :( .. Проблема в том, что я не мог найти постоянный порог (ближайшим был тот, который запускал метод 2-3), поэтому я решил просто сопоставить логическое значение (mFallen) с кнопка, щелчок по которой снова включит обнаружение падения.. Итак, на данный момент пользователь должен вручную повторно включить обнаружение падения, поскольку оно будет отключено при первом вызове метода.Однако ваше предложение по-прежнему является основной идеей, поэтому спасибо: )
Еще одна вещь, комментарий, который не был опубликован, меня смутил, почему он срабатывал 2-4 раза: D
Определенно есть способ сделать это лучше, чем повторное включение слушателя :) На самом деле, вы должны видеть, что
onSensorChanged()
вызывается несколько раз, так как он постоянно проверяет изменения значений датчика, и некоторые из них могут быть пиками. Пожалуйста, смотрите мой обновленный ответ для лучшего алгоритма обнаружения постоянного.@ Y.M Эй, прошла уже неделя, помог ли мой обновленный ответ?
Здравствуйте, извините за поздний ответ. Это, безусловно, помогло, но мне нужно время, чтобы проверить разные значения, пока я не достигну идеального порога (где метод не будет вызываться более одного раза)