Частота слушателя датчика акселерометра Android неожиданно изменилась

У меня есть приложение, которое вызывает sensorManager.registerListener() для акселерометра, гироскопа и магнитометра, которое регистрирует все датчики для обработчика, и каждый из них установлен в SENSOR_DELAY_NORMAL. Это прекрасно работает без проблем в подавляющем большинстве случаев.

Однако, просматривая некоторые журналы, я заметил, что акселерометр, по-видимому, случайно изменит частоту примерно с 179 мс (что, по-видимому, является средней величиной SENSOR_DELAY_NORMAL на моем телефоне) до примерно 20 мс.

Проведя достаточное количество копаний и испытаний, я обнаружил, что причина в том, что телефон быстро трясется. Когда это произойдет, все остальные датчики будут поддерживать свою скорость ~179 мс, но только акселерометр увеличит ее скорость до ~20 мс. Через некоторое время скорость будет постепенно снижаться с ~20 мс до заданной скорости ~179 мс.

Я не уверен, сколько времени потребуется, чтобы оно вернулось к скорости ~179 мс, я попытался удалить и переустановить приложение, и, если не прошло достаточно времени, акселерометр все еще будет запускать события на ~20 мс.

Я хотел посмотреть, смогу ли я решить проблему, но отмените регистрацию и перерегистрацию слушателя с правильной частотой, когда это произойдет, однако акселерометр будет продолжать работать на ~20 мсек независимо от того, к чему я его перенастроил. Однако я обнаружил, что могу отменить регистрацию слушателя акселерометра, и это, кажется, работает, но это не решает мою проблему.

Кто-нибудь знает, почему слушатель акселерометра изменит свою частоту, с которой он стреляет, и как я смогу решить эту проблему?

1 ответ

Решение

Задержка, для которой вы запрашиваете Android, является только предполагаемой задержкой. Система Android и другие приложения могут изменить это. Источник

Причина, по которой это может произойти, довольно проста -

  • На устройстве доступно только ограниченное количество физических датчиков, 1 акселерометр, 1 магнитометр, 1 гироскоп
  • Скажите ваше приложение, регистрирует все события от акселерометра каждые 100 мс.
  • Другое приложение, запросы на все события от акселерометра каждые 10 мс
  • Теперь, поскольку имеется только один датчик и две разные потребности, Android позволяет акселерометру предоставлять данные с наименьшим из всех запросов на задержку, сделанных всеми приложениями, а затем Android сообщает обо всех событиях только с этой частотой задержки.
  • В этом случае, разработчик приложения должен игнорировать события, когда они превышают то, что требуется.
Другие вопросы по тегам