Синхронизировать устройства 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

  • Чтение и запись C ++ int Atomic?
  • Почему не логично синхронизировать логику?
  • C # версия синхронизированного ключевого слова java?
  • Заказ streamов для запуска в том порядке, в котором они были созданы / запущены
  • Печать Even and Odd с использованием двух streamов в Java
  • В чем разница между синхронизированным методом и синхронизированным блоком в Java?
  • Как синхронизировать базу данных SQLite на телефоне Android с базой данных MySQL на сервере?
  • Лучший инструмент для синхронизации баз данных MySQL
  • Ожидание выполнения нескольких streamов в Java
  • Различия между неявным, явным и текучим
  • Синхронизация IPC с общей памятью (без блокировки)
  • Interesting Posts

    Восстановить bitmap ImageView

    Java: сколько времени использует пустой цикл?

    Выберите элемент, когда имя classа начинается с определенного слова

    Как обрезать таблицу с ограниченным внешним ключом?

    Проводка на стене друзей с помощью API-интерфейса Graph через соединение «feed» с 6 февраля 2013 г.

    Что означает статистика использования Tiler в инструменте iPhone OpenGL ES?

    Уничтожение объектов в C ++

    как отправить несколько данных с помощью $ .ajax () jquery

    Как установить значение по умолчанию для выбора списка в MVC во время выполнения

    В чем разница между использованием конструктора и getInitialState в React / React Native?

    Ориентация камеры iPhone AVFoundation

    Драйвер не смог установить безопасное соединение с SQL Server с использованием шифрования Secure Sockets Layer (SSL)

    Добавление пути .exe по умолчанию без добавления каталога

    Экран иногда мигает черным

    Что означает «запрос к члену« ******* »во что-то, что не является структурой или союзом?

    Давайте будем гением компьютера.