88 votes

Comment puis-je vérifier l'état actuel du récepteur GPS ?

Comment puis-je vérifier l'état actuel du récepteur GPS ? J'ai déjà vérifié le LocationListener onStatusChanged mais d'une manière ou d'une autre, il semble que cela ne fonctionne pas, ou que ce soit simplement la mauvaise possibilité.

En fait, j'ai juste besoin de savoir si l'icône GPS en haut de l'écran clignote (pas de coordonnées réelles) ou si elle est fixe (coordonnées disponibles).

149voto

soundmaven Points 1058

En tant que développeur de SpeedView : GPS speedometer for 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 :

  1. onStatusChanged() n'est pas appelé sur Eclair et Froyo.
  2. Le simple fait de compter tous les satellites disponibles est, bien entendu, inutile.
  3. Vérifier si l'un des satellites renvoie vrai pour usedInFix() n'est pas non plus très utile. Le système perd clairement le correctif mais continue de rapporter qu'il y a encore plusieurs satellites qui sont utilisés dans le correctif.

Voici donc la seule solution efficace 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 millisecondes, mais je vous conseille de la fixer autour de 3 à 5 secondes.

Cela fonctionne réellement et, bien que je n'aie pas examiné le code source qui dessine l'icône GPS native, cela se rapproche de la reproduction de son comportement. J'espère que cela aidera quelqu'un.

25voto

sast Points 216

L'icône GPS semble changer d'état en fonction des intentions de diffusion reçues. Vous pouvez changer son état vous-même avec les exemples de code suivants :

Notifier que le GPS a été activé :

Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
intent.putExtra("enabled", true);
sendBroadcast(intent);

Notifier que le GPS reçoit des corrections :

Intent intent = new Intent("android.location.GPS_FIX_CHANGE");
intent.putExtra("enabled", true);
sendBroadcast(intent);

Notifier que le GPS ne reçoit plus de corrections :

Intent intent = new Intent("android.location.GPS_FIX_CHANGE");
intent.putExtra("enabled", false);
sendBroadcast(intent);

Notifier que le GPS a été désactivé :

Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
intent.putExtra("enabled", false);
sendBroadcast(intent);

Exemple de code pour enregistrer le récepteur aux intents :

// MyReceiver must extend BroadcastReceiver
MyReceiver receiver = new MyReceiver();
IntentFilter filter = new IntentFilter("android.location.GPS_ENABLED_CHANGE");
filter.addAction("android.location.GPS_FIX_CHANGE");
registerReceiver(receiver, filter);

En recevant ces intentions de diffusion, vous pouvez remarquer les changements d'état du GPS. Cependant, vous ne serez notifié que lorsque l'état change. Il n'est donc pas possible de déterminer l'état actuel en utilisant ces intents.

19voto

chich Points 351

Je suis un nouveau membre et je ne peux malheureusement pas commenter ou voter, mais le message de Stephen Daye ci-dessus était la solution parfaite au même problème que celui pour lequel je cherchais de l'aide.

une petite modification de la ligne suivante :

isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < 3000;

à :

isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < (GPS_UPDATE_INTERVAL * 2);

En fait, comme je construis un jeu à rythme lent et que mon intervalle de mise à jour est déjà fixé à 5 secondes, une fois que le signal GPS est hors service pendant plus de 10 secondes, c'est le bon moment pour déclencher quelque chose.

merci mon pote, j'ai passé environ 10 heures à essayer de résoudre cette solution avant de trouver ton post :)

14voto

Christopher Orr Points 58514

Ok, alors essayons une combinaison de toutes les réponses et mises à jour jusqu'ici et faisons quelque chose comme ça :

L'écouteur GPS pourrait être quelque chose comme ceci :

GpsStatus.Listener listener = new GpsStatus.Listener() {
    void onGpsStatusChanged(int event) {
        if (event == GPS_EVENT_SATELLITE_STATUS) {
            GpsStatus status = mLocManager.getGpsStatus(null);
            Iterable<GpsSatellite> sats = status.getSatellites();
            // Check number of satellites in list to determine fix state
        }
    }
}

Les API ne sont pas très claires quant au 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 y en a moins de trois, vous ne pouvez pas avoir de position. S'il y en a plus, alors vous devriez avoir une position.

La méthode de l'essai et de l'erreur est probablement la meilleure façon de déterminer la fréquence à laquelle Android transmet les informations sur les satellites, ainsi que les informations que chaque utilisateur doit transmettre. GpsSatellite objet contient.

8voto

Justin Breitfeller Points 6375

Après avoir travaillé quelques années avec le GPS sur Windows Mobile, je me suis rendu compte que le concept de "perte" d'une position GPS peut être subjectif. Pour écouter simplement ce que le GPS vous dit, il suffit d'ajouter un écouteur NMEAL et d'analyser la phrase pour savoir si la position était "valide" ou non. Voir http://www.gpsinformation.org/dale/nmea.htm#GGA . Malheureusement, avec certains GPS, cette valeur fluctue dans un sens ou dans l'autre, même au cours d'un fonctionnement normal dans une zone de "bonnes coordonnées".

L'autre solution consiste donc à comparer l'heure UTC de l'emplacement GPS avec l'heure du téléphone (convertie en UTC). S'ils présentent un certain décalage horaire, vous pouvez supposer que vous avez perdu la position GPS.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X