Questa domanda potrebbe essere leggermente prolissa, ma è aperta per molti suggerimenti.Tempo di sincronizzazione per la registrazione di dati su più dispositivi Android
problema dichiarazione:
Abbiamo livello vari API 8 (Android 2.2) dispositivi MYTOUCH che useremo per registrare dati di accelerazione in un parco divertimenti, cioè su un ottovolante. Abbiamo anche una funzione di visualizzazione che ci consente di tracciare e visualizzare i punti dell'accelerometro in funzione del tempo in cui sono stati registrati. Qui è dove abbiamo un dilemma! I tempi di sistema sui dispositivi Android non sono tutti uguali, né possono essere impostati allo stesso tempo con precisione millisecondo (solo manualmente con precisione minuscola, che è terribile).
Tentativi Soluzione:
Così, ho fatto ricorso alla registrazione dei dati in base a un tempo GPS trovato all'inizio della app. Corto processo lungo: ottenere il tempo GPS, ottenere l'ora del sistema, ottenere la differenza e dopo aver registrato un punto dati, ottenere di nuovo il tempo di sistema e aggiungere la differenza all'ora, etichettarlo come ora di inizio della registrazione e incrementare di 200 millisecondi per ciascun punto dati registrati da lì. Tuttavia, ci sono 2 problemi (per ottenere il tempo GPS):
Uso
getLastKnownLocation()
non è troppo preciso. In realtà, sembra molto impreciso. Mi sta dando dei tempi che sono 9 minuti fuori dall'ora GMT/UTC corrente. Per coincidenza, tuttavia, il tempo di sistema è anche di circa 9 minuti di spegnimento sul dispositivo Android ... la differenza tra l'ora GPS e l'ora del sistema è in genere compresa tra 1000 e 5000 millisecondi (da 1 a 5 secondi). Suppongo che ci sia una possibilità che il mio codice sia sbagliato. L'ho incollato sotto per farti vedere.requestSingleUpdate()
sarebbe bello da usare, in quanto otterrebbe una posizione più recente e forse un tempo molto preciso. Problema? Richiede il livello API 9 ... dispositivi che non abbiamo.
Idee:
Ecco un'idea che ho avuto anche se - cosa succede se in qualche modo tirato un tempo di globale da un sito web e ha usato il tempo tirato da lì, come momento della registrazione? Problema qui - Non ho idea di come farlo, è solo un pio desiderio del mio ...
Un'altra idea: esiste una sorta di tipo globale getTime()
di cui semplicemente non so nulla?
Ragionamento questo che voglio Android di per tirare il tempo da un orologio simile:
immaginare due persone sedute sulle montagne russe - uno sul sedile anteriore, una sul retro. Quando si registrano i dati, la persona che precede avrà ovviamente delle accelerazioni leggermente prima che la persona nella parte posteriore (e vogliamo vederla sul nostro grafico di visualizzazione). Questo è il motivo per cui è cruciale, con precisione milliseconda, che questi punti vengono registrati in base a un singolo tempo globale.
Codice:
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){
}
}
Aggiornamento:
Here, qualcuno suggerisce una sorta di "server" getTime()
. Mi piace molto il suo codice/risposta, ma cos'è questo "server" e/o come posso impostarne uno, se questa è la soluzione migliore?
Realmente comunichiamo con un server che abbiamo: vedrò se uno dei ragazzi scriverà una funzione API che ricava tempo dal server con cui possiamo comunicare tramite i dispositivi Android. Grazie anche per il codice: molto utile. Ti risponderò se questo funziona/non funziona. – Mxyk
Grazie per l'aiuto - abbiamo deciso di utilizzare DatagramSockets per ospitare/ricevere orari su una rete WiFi simile in modo che tutti i telefoni possano sincronizzarsi con l'ora del telefono dell'host. Se ho qualche domanda su DatagramSocket, sarò sicuro di chiedere. – Mxyk
@Mxyk Quanto è stato preciso per sincronizzare l'ora sui dispositivi mobili? – flux