Время синхронизации для записи данных на нескольких устройствах Android

Этот вопрос может быть несколько многословным, но он открыт для многих предложений.


Постановка проблемы:
У нас есть несколько устройств MyTouch уровня API 8 (Android 2.2), которые мы будем использовать для записи данных об ускорении в парке развлечений, а именно на американских горках. У нас также есть функция визуализации, которая позволяет нам отображать и просматривать точки акселерометра в зависимости от времени, в которое они были записаны.Вот где у нас дилемма! Системное время на устройствах Android не все одинаковое, и они не могут быть установлены на одно и то же время с точностью до миллисекунды (только вручную с точностью до минуты, что ужасно).


Попытки решения:
Итак, я сначала прибегнул к записи данных в соответствии со временем GPS, найденным при запуске приложения. Длинный процесс короткий: получить время GPS, получить системное время, получить разницу, а после записи точки данных снова получить системное время и добавить разницу обратно ко времени, пометить это как время начала записи и увеличить на 200 миллисекунд для каждого записанная точка данных оттуда. Однако есть 2 проблемы (для получения времени GPS):

  • Использование getLastKnownLocation()не слишком точное. На самом деле это выглядит очень неточно. Это дает мне время, которое на 9 минут отличается от текущего времени GMT/UTC. Однако по совпадению системное время на устройстве Android также отличается почти на 9 минут... разница между временем GPS и системным временем обычно составляет от 1000 до 5000 миллисекунд (от 1 до 5 секунд). Я полагаю, что есть шанс, что мой код неверен. Я вставил его ниже, чтобы вы могли видеть.

  • requestSingleUpdate()было бы здорово использовать, так как он получит более свежее местоположение и, возможно, очень точное время. Проблема? Требуется уровень API 9... устройств, которых у нас нет.


Идеи:
Вот идея, которая у меня возникла: что, если я каким-то образом вытащу глобальное время с веб-сайта и использую это время в качестве времени записи? Проблема здесь - я понятия не имею, как это сделать, это просто мои фантазии...

Еще одна идея: существует ли какая-то глобальная функция getTime()-типа, о которой я просто не знаю?


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


Код:

Criteria c = new Criteria();
c.setAccuracy(Criteria.ACCURACY_FINE);

if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
    mLocationManager.requestLocationUpdates(mLocationManager.getBestProvider(c, true), 0, 0, AmusementPark.this);
    Criteria criteria = new Criteria();
    String bestProvider = mLocationManager.getBestProvider(criteria, false);
    Location location = mLocationManager.getLastKnownLocation(bestProvider);

    try {

        gpsTime = location.getTime();
        systemTime = System.currentTimeMillis();
        timeDif = gpsTime - systemTime;
        Log.e("timedif", "GPS: " + gpsTime + ", System: " + systemTime +", Dif: " + timeDif);

    } catch (NullPointerException e){

    }

}

Обновление:
Здесь, кто-то предлагает что-то вроде "сервера" getTime(). Мне очень нравится его код/ответ, но что это за "сервер" и/или как его настроить, если это лучшее решение?

7
задан Mxyk 25 June 2012 в 16:29
поделиться