To pytanie może być nieco rozwlekłe, ale jest otwarte na wiele sugestii.Czas synchronizacji do nagrywania danych na wielu urządzeniach z systemem Android
komunikat Problem:
Mamy kilka API poziom 8 (Android 2.2) Urządzenia myTouch że będziemy używać do rejestrowania danych przyspieszenia w parku rozrywki, a mianowicie na roller coaster. Posiadamy również funkcję wizualizacji, która pozwala nam na wykreślenie i wyświetlenie punktów akcelerometru w funkcji czasu, w którym zostały zarejestrowane. Tutaj mamy dylemat! Czasy systemu na urządzeniach z Androidem nie są takie same, ani nie można ich ustawić w tym samym czasie z dokładnością do milisekund (tylko ręcznie z dokładnością minutową, co jest okropne).
Rozwiązanie Próby:
Więc najpierw uciekają się do zapisu danych według czasu GPS znalezionego na początku aplikacji. Długi krótki proces: pobierz czas GPS, uzyskaj czas systemowy, uzyskaj różnicę i po zarejestrowaniu punktu danych, uzyskaj ponownie czas systemowy i dodaj różnicę z powrotem do czasu, oznacz to jako czas rozpoczęcia nagrywania i zwiększ o 200 milisekund dla każdego zarejestrowany punkt danych z tego miejsca. Jednakże istnieją 2 problemy (dotyczące uzyskiwania czas GPS):
Korzystanie
getLastKnownLocation()
nie jest zbyt dokładne. W rzeczywistości wydaje się bardzo niedokładne. To daje mi czasy, które wynoszą 9 minut od aktualnego czasu GMT/UTC. Jednak czas systemowy jest również prawie 9 minut wyłączony na urządzeniu z systemem Android ... różnica między czasem GPS a czasem systemowym wynosi zwykle od 1000 do 5000 milisekund (od 1 do 5 sekund). Przypuszczam, że jest szansa, że mój kod jest błędny. Wkleiłem to poniżej, abyś mógł je zobaczyć.requestSingleUpdate()
byłby świetny w użyciu, ponieważ uzyskałby nowszą lokalizację i prawdopodobnie bardzo dokładny czas. Problem? Wymaga urządzeń poziomu API 9 ... których nie mamy.
Pomysły:
Oto pomysł miałem, choć - co jeśli ja jakoś wyciągnął czasu globalnego ze strony internetowej i wykorzystywane czas wyciągnął stamtąd jako czas nagrywania? Problem tutaj - Nie mam pojęcia, jak to zrobić, to tylko moje życzeniowe myślenie ...
Kolejny pomysł - czy istnieje jakiś globalny typ funkcji, o którym po prostu nie wiem?
Rozumowanie dlaczego chcę Android ciągnąć razem z podobnym zegarem:
Wyobraźmy sobie dwie osoby siedzącej na roller coaster - jeden na przednim siedzeniu, jeden na plecach. Podczas rejestrowania danych, osoba z przodu będzie wyraźnie odczuwać przyspieszenia, zanim osoba z tyłu (i chcemy to zobaczyć na naszym wykresie wizualizacji). Dlatego tak ważne jest, z dokładnością do milisekundy, że punkty te są rejestrowane według jednego, globalnego czasu.
Kod:
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){
}
}
Aktualizacja:
Here ktoś sugeruje coś w rodzaju "serwer" getTime()
. Bardzo podoba mi się jego kod/odpowiedź, ale co to jest "serwer" i/lub jak go skonfigurować, jeśli jest to najlepsze rozwiązanie?
W rzeczywistości komunikujemy się z serwerem, który mamy - zobaczę, czy któryś z chłopaków napisze funkcję API, która dostaje czas z serwera, z którym możemy komunikować się za pośrednictwem urządzeń z Androidem. Dzięki za kod również - bardzo pomocne. Wrócę do ciebie, jeśli to zadziała lub nie zadziała. – Mxyk
Dzięki za pomoc - zdecydowaliśmy się użyć DatagramSockets do hostowania/odbierania czasów w podobnej sieci Wi-Fi, aby wszystkie telefony mogły synchronizować się z czasem telefonu hosta. Jeśli mam jakieś pytanie w DatagramSocket, na pewno zapytam. – Mxyk
@Mxyk Jak dokładne było zsynchronizowanie czasu na urządzeniach mobilnych? – flux