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

Укороченная версия:

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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

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

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

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

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

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