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

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

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

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

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

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

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

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

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

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

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

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

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


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


EDIT: Я хочу отредактировать этот ответ. После работы в качестве разработчика GNSS в ОС Android я понял, что многие «крупные» OEM-производители 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

  • Избегайте синхронизации (это) в Java?
  • Символические ссылки и синхронизированные папки в Vagrant
  • Wait Firebase async извлекает данные на Android
  • Правильный способ синхронизации ArrayList в java
  • В чем разница между атомными / летучими / синхронизированными?
  • Синхронизация и System.out.println
  • Различия между неявным, явным и текучим
  • C # версия синхронизированного ключевого слова java?
  • Монитор против Mutex в c #
  • Синхронизированный блок Java для .class
  • Печать Even and Odd с использованием двух streamов в Java
  • Давайте будем гением компьютера.