Подтвердить что ты не робот

Синхронизировать устройства Android через время GPS?

Краткая версия:

Проблема. Мне нужно несколько устройств Android, чтобы сделать что-то в одно и то же время (в пределах около 100 миллисекунд). Например, я хочу, чтобы все устройства воспроизводили определенный звук в ранее определенный момент времени.

Вопрос: Могу ли я использовать время GPS, чтобы синхронизировать часы устройств?

Более длинная версия:

Несколько человек, имеющих устройства Android, находятся в одном и том же месте на открытом воздухе (для определенного спортивного события). Все устройства должны сигнализировать о некоторых событиях в одно и то же время. (Какое время будет определено заранее, и не важно, чтобы они делали это именно в это время, пока они это делают одновременно). FWIW: эти мероприятия помогут людям начать свою спортивную деятельность одновременно.

Вот предположения, которые я могу сделать:

  • Там может быть или не быть покрытие ячеек. (Это на улице и может быть далеко от городских районов).
  • Устройства могут подключаться или не подключаться к Интернету. (Некоторые люди могут не иметь плана данных)
  • Устройства могут разговаривать друг с другом. Если устройства не подключены к Интернету, они будут подключены через Wi-Fi (хотя Wi-Fi может не иметь интернет-шлюз).
  • Устройства снаружи (а не внутри зданий). (Это хорошо, это означает, что все устройства могут получить GPS-исправление).
  • Устройства физически близки друг к другу (т.е. в пределах 300 м2). (Не уверен, что это важно)

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

При запуске приложения каждое устройство может запросить исправление GPS и сохранить разницу между временем GPS и его внутренними часами. Теперь мастер может объявить события на основе этого времени GPS (используя его внутренние часы и вычитая смещение, которое он сохранил ранее).

Будет ли это достаточно точным и надежным?

Большое спасибо заранее, Андреас Лейтнер

4b9b3361

Ответ 1

Вы можете получить разницу во времени в миллисекундах от currentTimeMillis() и Location.getTime() в обратном вызове onLocationChanged(). Используйте requestSingleUpdate()


Я просто хочу добавить, что если у пользователя есть соединение с данными, они могут использовать время NTP, что еще точнее, так как внутренние часы GPS могут дрейфовать и исправлять это занимает некоторое время.


EDIT: Я хочу отредактировать этот ответ. После работы в качестве разработчика GNSS в ОС Android я понял, что многие "крупные" OEM-производители Android испортили это. Обычно предложения NMEA генерируются в наборе микросхем или GNSS. Иногда время правильное, это зависит от реализации.

Также есть проблема секунды прыжка. Время GPS не время UTC. И из этого запись идет на 18 секунд вперед.

Также время GPS от объектов Location теперь является системным временем согласно документации

TL;DR: используйте время NTP

Ответ 2

Вы не можете полностью полагаться на время GPS, так как для некоторых устройств существует известная проблема, что время, полученное для некоторых устройств, на один день вперед. В этом случае вы можете получить большое смещение.

http://code.google.com/p/android/issues/detail?id=23937

Обходной путь для решения этой проблемы обсуждался здесь: Android: Samsung Galaxy Tabs и Android 2.2 Устройства, показывающие дату GPS 1 день Advance с 1-го jan 2012

Ответ 3

UTC не выводится из GPS, APK переопределяет GPS. Android установлен для игнорирования GPS-часов. Вы getTime() - это NIST. не GPS