Проблема с Android в выяснении того, как недавно было исправлено

Мое приложение использует LocationListener для отслеживания текущего местоположения. Пока GPS-провайдер предоставляет регулярные исправления, это работает хорошо. Тем не менее, я хочу, чтобы мое приложение предупреждало пользователя, если местоположение больше не является надежным, потому что исправление больше не актуально. Поэтому я использовал timeCheckHandler для вызова getLastKnownLocation каждые несколько секунд.

Моя проблема заключается в том, что даже когда часто получаются точные исправления, время, возвращаемое методом getTime() к местоположению, возвращаемому getLastKnownLocation, обычно старше, чем текущее время, возвращаемое System.currentTimeMillis(), часто примерно на 20 секунд.

Я исследовал проблему дальше, добавив код в onLocationChanged(arg0) для регистрации времени исправления (arg0.getTime()) и текущего времени (System.currentTimeMillis()). Снова вижу разницу около 20 секунд.

Код в настоящее время читается следующим образом:

    public void onLocationChanged(Location arg0) {
    mapview.handleLocationChanged(mapview, arg0.getLatitude(), arg0.getLongitude(), arg0.getBearing(), arg0.getAccuracy(), "GPS fix");
    addDebugNote("Fix received at time: "+Long.toString(arg0.getTime()/1000)+" Now: "+Long.toString((System.currentTimeMillis())/1000));
}

и типичный вывод в мой файл отладки читает:

Fix received at time: 1292091908 Now: 1292091928

Почему я должен видеть эту разницу между временем исправления и текущим системным временем?

Должен ли я признать, что разница в 20 секунд - это нормально?

2 ответа

Решение

Время определения местоположения GPS зависит от времени вашего провайдера / времени устройства. System.currentTimeMillis() даст вам время устройства, установленное на вашем устройстве.

Если вы хотите узнать, какова последняя точка зрения, вы можете:

  1. Синхронизируйте оба времени ( GPS и устройство) в своем коде при запуске приложения, принимая разницу между ними, как только вы получите первое обновление местоположения GPS. В этот момент запросите время устройства и посмотрите, в чем разница между ними. Сохраните эту разницу в переменной.

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

Также я обнаружил, что используя NETWORK в качестве поставщика местоположения, вы можете получать только время устройства. Поэтому, если вы слушаете обновления как из GPS (так и из сети), вам также может понадобиться определить это с помощью location_obj.getProvider() и отфильтровать провайдера GPS.

Повторяя тест сегодня, я обнаружил, что разница между временем GPS и временем системы составляет 22 секунды. Эта проблема обсуждается в другом месте в Интернете, и кажется, что есть разница между временем GPS и системным временем телефона (которое в моем случае настроено для автоматического обновления из сети). Одним из факторов является то, что GPS время составляет около 15 или 17 секунд (в зависимости от того, какой источник является правильным) от времени UTC... оно не синхронизировано, потому что время GPS не обновлялось с 1980 года для периодических "високосных секунд".

Принимая это во внимание, я думаю, что ответом на мою потребность проверить, насколько актуальным является последнее исправление, будет сравнение текущего системного времени с системным временем (не временем GPS) последнего исправления.

Другие вопросы по тегам