Синхронизировать устройства Android через время GPS?
Укороченная версия:
Проблема. Мне нужно несколько устройств Android, чтобы сделать что-то в одно и то же время (в пределах около 100 миллисекунд). Например, я хочу, чтобы все устройства воспроизводили определенный звук в ранее определенный момент времени.
Вопрос: Могу ли я использовать время GPS, чтобы синхронизировать часы устройств?
- Явная блокировка Java
- Синхронизация по целочисленному значению
- Java Singleton и синхронизация
- Каковы различия между различными параметрами синхронизации streamов в C #?
- Почему не логично синхронизировать логику?
Более длинная версия:
Несколько человек, имеющих устройства Android, находятся в одном и том же месте на открытом airе (для некоторых конкретных спортивных событий). Все устройства должны сигнализировать о некоторых событиях в одно и то же время. (Какое время будет определено заранее, и не важно, чтобы они делали это именно в это время, пока они это делают одновременно). FWIW: эти мероприятия помогут людям начать свою спортивную деятельность одновременно.
Вот предположения, которые я могу сделать:
- Там может быть или не быть охват клеток. (Это на улице и может быть далеко от городских районов)
- Устройства могут подключаться или не подключаться к Интернету. (Некоторые люди могут не иметь плана данных)
- Устройства могут разговаривать друг с другом. Если устройства не подключены к Интернету, они будут подключаться через Wi-Fi (хотя Wi-Fi может не иметь интернет-шлюз).
- Устройства снаружи (а не внутри зданий). (Это хорошо, это означает, что все устройства могут получить GPS-решение)
- Устройства физически близки друг к другу (т. Е. В пределах 300 м2). (Не уверен, что это важно)
Я не могу использовать внутренние часы, чтобы знать, когда играть в события: пользователи могут вручную изменить время, и даже если устройство настроено на получение времени от сотовой сети, эта сеть может не обеспечить точное время. Два устройства могут быть забронированы в разных сетях, и поэтому их время может не синхронизироваться очень хорошо.
При запуске приложения каждое устройство может запросить исправление GPS и сохранить разницу между временем GPS и его внутренними часами. Теперь мастер может объявить события на основе этого времени GPS (используя его внутренние часы и вычитая смещение, которое он сохранил ранее).
Будет ли это достаточно точным и надежным?
Большое спасибо заранее, Андреас Лейтнер
- Пример / учебник Mutex?
- Синхронизировано ли унаследовано в Java?
- Как сделать блокировку с несколькими чтениями / одиночной записью из более простых примитивов синхронизации?
- Заказ streamов для запуска в том порядке, в котором они были созданы / запущены
- Зачем использовать ReentrantLock, если вы можете использовать синхронизированный (это)?
- В чем разница между синхронизацией на lockObject и использованием этого как блокировки?
- Синхронизация IPC с общей памятью (без блокировки)
- Как определить, заблокирован ли объект (синхронизирован), чтобы он не блокировался на Java?
Вы можете получить разницу во времени в миллисекундах с 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