2016-04-20 1 views
3

Ceci est mon constructeur GPSTracker classe:getLastKnownLocation NULL de retour à l'aide GPS_PROVIDER et NETWORK_PROVIDER

public GPSTracker(Context context) { 
    this.mContext = context; 
    locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE); 

    Location gpsLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
    Location networkLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
} 

gpsLocation et NetworkLocation sont toujours NULL. La méthode getLastKnowLocation ne me retourne aucun emplacement ... même si je suis sûr que quelques secondes avant l'activité lunching (et la création de l'objet GPSTracker) l'appareil avait un emplacement réseau (j'ai désactivé la géolocalisation après avoir vérifié qu'un réseau emplacement était disponible)

testé sur Nexus 5 avec Android studio

+0

Quelle est la question? –

Répondre

1

Oui, getLastKnownLocation() peut bien retourner null. Le documentation dit:

Renvoie un emplacement indiquant les données de la dernière position connue fix obtenu du fournisseur donné.

Cela peut être fait sans démarrer le fournisseur. Notez que cet emplacement peut être obsolète, par exemple si l'appareil a été désactivé et déplacé vers un autre emplacement.

Si le fournisseur est actuellement désactivé, null est renvoyé.

Un appareil Android ne suit pas automatiquement son emplacement en permanence. Le "dernier emplacement connu" n'est disponible que si une application a demandé l'emplacement. Donc, vous ne devriez pas vous attendre à toujours obtenir un emplacement avec getLastKnownLocation(). Et même s'il renvoie quelque chose, l'emplacement pourrait ne pas être à jour. L'objet Location a un horodatage que vous pouvez lire avec la méthode getTime() et une précision estimée que vous pouvez lire avec la méthode getAccuracy(). Ceux-ci peuvent être utilisés pour évaluer l'emplacement est utilisable.

Si vous recevez null ou un très ancien emplacement, vous devrez demander un nouvel emplacement. Les options de base ne demandent qu'une mise à jour d'emplacement unique ou des mises à jour continues avec un intervalle de temps que vous pouvez spécifier.

Dans les deux cas votre classe doit implémenter l'interface LocationListener:

public class GpsTracker implements LocationListener { 

    // ...other code goes here... 

    @Override 
    public void onLocationChanged(Location location) { 

     // Do something with 'location' here. 

    } 
} 

Pour un emplacement unique mise à jour vous appelleriez [LocationManager.requestSingleUpdate()] (http://developer.android.com/reference/android/location/LocationManager.html#requestSingleUpdate(java.lang.String, android.location.LocationListener, android.os .Looper)) et pour les mises à jour continues [LocationManager.requestLocationUpdates()] (http://developer.android.com/reference/android/location/LocationManager.html#requestLocationUpdates(java.lang.String, long, float, android.location.LocationListener)). Dans les deux cas, il y aura un petit (ou pas si petit) délai et le rappel LocationListener.onLocationChanged() est appelé lorsqu'un emplacement est disponible.

Par exemple, vous pouvez demander une mise à jour unique du fournisseur de GPS comme ceci:

locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, this, null); 

Pour les mises à jour continues du fournisseur de GPS max.chaque 1 seconde et que lorsque l'emplacement a changé au moins 1 mètre que vous pourriez appeler:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, this); 

Et puis il y a encore plus de variations de la requestSingleUpdate() que vous pouvez voir dans la documentation et d'autre part le Google Play API de localisation de services mais n'allons pas là-bas. Votre question portait sur getLastKnownLocation() retournant null et Stack Overflow a plusieurs exemples de différentes façons de demander un emplacement à jour.