Частота слушателя датчика акселерометра 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 сообщает обо всех событиях только с этой частотой задержки.
- В этом случае, разработчик приложения должен игнорировать события, когда они превышают то, что требуется.