En tant que développeur de SpeedView: compteur de vitesse GPS pour Android, j'ai dû essayer toutes les solutions possibles à ce problème, toutes avec le même résultat négatif. Répétons ce qui ne fonctionne pas:
- onStatusChanged () n'est pas appelé sur Eclair et Froyo.
- Il est bien entendu inutile de simplement compter tous les satellites disponibles.
- Vérifier si l'un des satellites retourne vrai pour usedInFix () n'est pas très utile également. Le système perd clairement le correctif mais continue de signaler qu'il y a encore plusieurs sats qui y sont utilisés.
Voici donc la seule solution fonctionnelle que j'ai trouvée, et celle que j'utilise réellement dans mon application. Disons que nous avons cette classe simple qui implémente le GpsStatus.Listener:
private class MyGPSListener implements GpsStatus.Listener {
public void onGpsStatusChanged(int event) {
switch (event) {
case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
if (mLastLocation != null)
isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < 3000;
if (isGPSFix) { // A fix has been acquired.
// Do something.
} else { // The fix has been lost.
// Do something.
}
break;
case GpsStatus.GPS_EVENT_FIRST_FIX:
// Do something.
isGPSFix = true;
break;
}
}
}
OK, maintenant dans onLocationChanged () nous ajoutons ce qui suit:
@Override
public void onLocationChanged(Location location) {
if (location == null) return;
mLastLocationMillis = SystemClock.elapsedRealtime();
// Do something.
mLastLocation = location;
}
Et c'est tout. En gros, c'est la ligne qui fait tout:
isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < 3000;
Vous pouvez bien sûr modifier la valeur en millis, mais je suggérerais de la définir autour de 3-5 secondes.
Cela fonctionne réellement et bien que je n'ai pas regardé le code source qui dessine l'icône GPS native, cela est proche de reproduire son comportement. J'espère que cela aide quelqu'un.
mLastLocationMillis
été défini par une source autre que le GPS? Le système prétendrait queisGPSFix
c'est vrai, mais en réalité, il s'agit de n'importe quelle solution (peut-être celle du réseau téléphonique)L'icône GPS semble changer d'état en fonction des intentions de diffusion reçues. Vous pouvez modifier son état vous-même avec les exemples de code suivants:
Avertissez que le GPS a été activé:
Avertissez que le GPS reçoit des correctifs:
Avertissez que le GPS ne reçoit plus de correctifs:
Avertissez que le GPS a été désactivé:
Exemple de code pour enregistrer le récepteur selon les intentions:
En recevant ces intentions de diffusion, vous pouvez remarquer les changements d'état du GPS. Cependant, vous ne serez averti que lorsque l'état change. Il n'est donc pas possible de déterminer l'état actuel à l'aide de ces intentions.
la source
nouveau membre donc malheureusement je suis incapable de commenter ou de voter, mais le message de Stephen Daye ci-dessus était la solution parfaite au même problème que j'ai cherché de l'aide.
une petite modification de la ligne suivante:
à:
En gros, alors que je construis un jeu au rythme lent et que mon intervalle de mise à jour est déjà réglé à 5 secondes, une fois que le signal GPS est éteint pendant plus de 10 secondes, c'est le bon moment pour déclencher quelque chose.
salut mon pote, j'ai passé environ 10 heures à essayer de résoudre cette solution avant de trouver votre message :)
la source
Ok, essayons donc une combinaison de toutes les réponses et mises à jour jusqu'à présent et faisons quelque chose comme ceci:
ACCESS_FINE_LOCATION
autorisation à votre manifesteLocationManager
GpsStatus.Listener
qui réagit àGPS_EVENT_SATELLITE_STATUS
LocationManager
avecaddGpsStatusListener
L'auditeur GPS pourrait être quelque chose comme ceci:
Les API sont un peu floues sur le moment et la nature des informations GPS et satellite fournies, mais je pense qu'une idée serait de regarder combien de satellites sont disponibles. S'il est inférieur à trois, vous ne pouvez pas avoir de solution. Si c'est plus, vous devriez avoir une solution.
Les essais et erreurs sont probablement le moyen de déterminer la fréquence à laquelle Android rapporte les informations satellite et les informations que chaque
GpsSatellite
objet contient.la source
GpsSatellite
objet.LocationManager.requestLocationUpdates
avec les paramètres de temps et de distance réglés sur 0? Cela devrait vous envoyer des correctifs GPS dès qu'ils se produisent. Si vous ne recevez rien, c'est que vous n'avez probablement pas de solution. Vous pouvez combiner cela avec l'écouteur d'état ci-dessus si vous le souhaitez.Après quelques années de travail avec le GPS sur Windows Mobile, j'ai réalisé que le concept de «perdre» un repère GPS pouvait être subjectif. Pour simplement écouter ce que le GPS vous dit, l'ajout d'un NMEAListener et l'analyse de la phrase vous diront si le correctif était "valide" ou non. Voir http://www.gpsinformation.org/dale/nmea.htm#GGA . Malheureusement, avec certains GPS, cette valeur fluctuera d'avant en arrière même pendant le cours normal du fonctionnement dans une zone de «bonne position».
Donc, l'autre solution consiste à comparer l'heure UTC de la position GPS avec l'heure du téléphone (convertie en UTC). S'ils sont séparés par un certain décalage horaire, vous pouvez supposer que vous avez perdu la position GPS.
la source
entrer dans un problème similaire en travaillant sur mon projet MSc, il semble que la réponse de Daye a signalé par erreur "pas de solution" alors que l'appareil reste dans un emplacement statique. J'ai un peu modifié la solution, ce qui semble bien fonctionner pour moi dans un emplacement statique. Je ne sais pas comment cela affecterait la batterie car ce n'est pas ma principale préoccupation, mais voici comment je l'ai fait en redemandant les mises à jour de l'emplacement lorsqu'un correctif a expiré.
la source
Eh bien, la mise en place de chaque approche de travail entraînera ceci (traitant également des obsolètes
GpsStatus.Listener
):Remarque: cette réponse est une combinaison des réponses ci-dessus.
la source
Si vous avez juste besoin de savoir s'il existe un correctif, vérifiez le dernier emplacement connu fourni par le récepteur GPS et vérifiez la valeur .getTime () pour savoir quel âge a-t-il. Si c'est assez récent (comme ... quelques secondes), vous avez une solution.
... et enfin comparez cela à l'heure actuelle (en UTC!). Si c'est assez récent, vous avez un correctif.
Je fais cela dans mon application et jusqu'à présent tout va bien.
la source
Vous pouvez essayer d'utiliser LocationManager.addGpsStatusListener pour être mis à jour lorsque l'état du GPS change. Il semble que GPS_EVENT_STARTED et GPS_EVENT_STOPPED soient peut-être ce que vous recherchez.
la source
GPS_EVENT_FIRST_FIX
sons comme un ajustement plus proche.Je me trompe peut-être, mais il semble que les gens semblent s'éloigner du sujet
Cela se fait facilement avec
Pour voir si vous avez une solution solide, les choses deviennent un peu plus délicates:
Maintenant, chaque fois que vous voulez voir si vous avez un correctif?
Si vous voulez être sophistiqué, vous pouvez toujours avoir un délai d'attente en utilisant System.currentTimeMillis () et loc.getTime ()
Fonctionne de manière fiable, au moins sur un N1 depuis la version 2.1.
la source
Avec LocationManager, vous pouvez obtenirLastKnownLocation () après avoir obtenuBestProvider (). Cela vous donne un objet Location, qui a les méthodes getAccuracy () en mètres et getTime () en millisecondes UTC
Cela vous donne-t-il suffisamment d'informations?
Ou peut-être pourriez-vous parcourir les LocationProviders et découvrir si chacun répond aux critères (ACCURACY_COARSE)
la source
tant de messages ...
l'ajout de ce code, avec addGpsListener ... showMessageDialog ... affiche simplement une fenêtre de dialogue standard avec la chaîne
a parfaitement fait le travail pour moi :) merci beaucoup: =) (sry pour ce message, pas encore en mesure de voter)
la source
Si vous n'avez pas besoin d'une mise à jour au moment même où le correctif est perdu, vous pouvez modifier la solution de Stephen Daye de cette manière, que vous disposez d'une méthode qui vérifie si le correctif est toujours présent.
Ainsi, vous pouvez simplement le vérifier chaque fois que vous avez besoin de données GPS et que vous n'avez pas besoin de GpsStatus.Listener.
Les variables "globales" sont:
C'est la méthode qui est appelée dans "onLocationChanged ()" pour se souvenir de l'heure de mise à jour et de l'emplacement actuel. À côté de cela, il met à jour "isGpsFix":
Cette méthode est appelée chaque fois que j'ai besoin de savoir s'il existe un repère GPS:
Dans mon implémentation, je lance d'abord checkGpsFix () et si le résultat est vrai, j'utilise la variable "lastKnownLocation" comme position actuelle.
la source
Je sais que c'est un peu tard. Cependant, pourquoi ne pas utiliser le NMEAListener si vous voulez savoir si vous avez un correctif. D'après ce que j'ai lu, le NMEAListener vous donnera les phrases NMEA et à partir de là, vous choisirez la phrase correcte.
La phrase RMC contient l'état du correctif qui est soit A pour OK ou V pour avertissement. La phrase GGA contient la qualité de correction (0 invalide, 1 GPS ou 2 DGPS)
Je ne peux pas vous proposer de code java car je ne fais que commencer avec Android, mais j'ai créé une bibliothèque GPS en C # pour les applications Windows, que je souhaite utiliser avec Xamarin. Je suis tombé sur ce fil uniquement parce que je cherchais des informations sur les fournisseurs.
D'après ce que j'ai lu jusqu'à présent sur l'objet Location, je ne suis pas très à l'aise avec les méthodes comme getAccuracy () et hasAccuracy (). J'ai l'habitude d'extraire des phrases NMEA les valeurs HDOP et VDOP pour déterminer la précision de mes correctifs. Il est assez courant d'avoir un correctif, mais un HDOP médiocre, ce qui signifie que votre précision horizontale n'est pas du tout bonne. Par exemple, assis à votre bureau en train de déboguer avec un périphérique GPS Bluetooth externe contre une fenêtre, vous aurez probablement une solution, mais HDOP et VDOP très médiocres. Placez votre appareil GPS dans un pot de fleurs à l'extérieur ou quelque chose de similaire ou ajoutez une antenne externe au GPS et vous obtenez immédiatement de bonnes valeurs HDOP et VDOP.
la source
C'est peut-être la meilleure possibilité de créer une TimerTask qui définit régulièrement l'emplacement reçu à une certaine valeur (nulle?). Si une nouvelle valeur est reçue par le GPSListener, il mettra à jour l'emplacement avec les données actuelles.
Je pense que ce serait une solution efficace.
la source
Vous dites que vous avez déjà essayé onStatusChanged (), mais cela fonctionne pour moi.
Voici la méthode que j'utilise (je laisse la classe elle-même gérer le onStatusChanged):
Et je gère le onStatusChanged comme suit:
Notez que les méthodes onProvider {Dis, En} abled () concernent l'activation et la désactivation du suivi GPS par l'utilisateur; pas ce que vous recherchez.
la source
Définir un intervalle de temps pour vérifier le correctif n'est pas un bon choix .. j'ai remarqué que onLocationChanged n'est pas appelé si vous ne bougez pas .. ce qui est compréhensible puisque l'emplacement ne change pas :)
La meilleure façon serait par exemple:
la source