2010-12-11 79 views
6

Mon application utilise LocationListener pour garder une trace de l'emplacement actuel. Tant que le fournisseur GPS fournit des correctifs réguliers, cela fonctionne bien. Cependant, je souhaite que mon application alerte l'utilisateur si l'emplacement n'est plus fiable car le correctif n'est plus à jour. J'ai donc utilisé un timeCheckHandler pour appeler getLastKnownLocation toutes les quelques secondes. Mon problème est que même lorsque des correctifs précis sont reçus fréquemment, le temps renvoyé en appliquant getTime() à l'emplacement renvoyé par getLastKnownLocation est généralement plus ancien que l'heure actuelle renvoyée par System.currentTimeMillis(), souvent de 20 secondes environ. .Problème Android découvrant à quel point le dernier correctif GPS est récent

J'ai étudié le problème plus loin en ajoutant du code à onLocationChanged (arg0) pour consigner l'heure du correctif (arg0.getTime()) et l'heure actuelle (System.currentTimeMillis()). Encore une fois, je vois une différence d'environ 20 secondes.

Le code se lit actuellement comme suit:

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)); 
} 

et sortie typique de mon fichier de débogage lit:

Fix received at time: 1292091908 Now: 1292091928 

Pourquoi devrais-je rencontrerai cette différence entre le temps fixe et le temps de système actuel ?

Dois-je accepter qu'une différence d'environ 20 secondes est normale?

+0

J'ai eu le même problème et j'ai ajouté: 'arg0.setTime (System.currentTimeMillis()); 'comme première ligne dans' onLocationChanged (Location arg0) 'méthode pour" corriger "l'horodatage. Je ne suis pas sûr si cela va créer des effets secondaires plus tard – ApollonDigital

Répondre

20

L'heure de l'emplacement GPS est indépendante de l'heure et de l'heure de votre fournisseur réseau. System.currentTimeMillis() vous donnera l'heure de l'appareil sur votre appareil.

Si vous voulez savoir comment récemment le point est que vous pouvez:

  1. Synchronisez les deux fois (GPS et de l'appareil) dans votre code au démarrage de l'application en prenant la différence entre les deux dès que vous obtenez première mise à jour de localisation GPS. À ce moment de l'appareil de requête et de voir quelle est la différence dans les deux. Enregistrer cette différence dans la variable.

  2. Utilisez-le comme facteur de correction dans les mises à jour de localisation suivantes pour connaître l'heure exacte en fonction du cadre de référence dont vous avez besoin. (Périphérique ou GPS)

J'ai également trouvé que l'utilisation de NETWORK en tant que fournisseur d'emplacement vous permet d'obtenir uniquement l'heure de l'appareil. Donc, si vous écoutez des mises à jour à la fois (GPS et réseau), vous devrez peut-être distinguer cela à l'aide de location_obj.getProvider() et filtrer le fournisseur GPS.

+1

Merci. C'est très utile. (J'imagine que le temps GPS doit être très précis pour qu'il fonctionne avec une telle précision.Je me demande pourquoi les réseaux téléphoniques ne sont tout simplement pas synchronisés avec lui.) – prepbgg

+0

bon point, peut-être son plus probable que le réseau est sur que gps? D'une manière ou d'une autre, si votre téléphone synchronise l'heure sur gps, ne rencontre-t-on pas une heure de réseau qui était éteinte quand nous avons essayé getTime()? donc, fondamentalement, nous aurions à temporisateurs lorsque nous avons utilisé le réseau pour les mises à jour de localisation –

1

En répétant le test aujourd'hui, j'ai trouvé que la différence entre l'heure GPS et l'heure du système est de 22 secondes. Ce problème est abordé ailleurs sur le web et il semble normal qu'il y ait une différence entre l'heure GPS et l'heure système du téléphone (qui dans mon cas doit être mise à jour automatiquement à partir du réseau). Un facteur est que le GPS le temps est d'environ 15 ou 17 secondes (en fonction de la source correcte) depuis l'heure UTC ... il est désynchronisé car l'heure GPS n'a pas été mise à jour depuis 1980 pour des "secondes intercalaires" périodiques. En gardant cela à l'esprit, je pense que la réponse à mon besoin de vérifier à quel point le dernier correctif est de comparer l'heure actuelle du système avec l'heure du système (pas l'heure GPS) de la dernière correction.

+0

Relecture de la référence Android pour l'emplacement Je me souviens que getTime() renvoie l'heure UTC du correctif, et je suppose que je peux compter sur cette précision. Par conséquent, il doit être l'heure du système du téléphone qui est inexacte. En lisant plus loin sur Internet, je vois qu'il est habituel que les horloges des téléphones se désynchronisent de plusieurs secondes. – prepbgg