web-dev-qa-db-fra.com

getLastKnownLocation renvoie la valeur null

J'ai lu des questions à ce sujet, mais je n'ai pas trouvé la réponse dont j'avais besoin.

Ainsi, le cas est que ma carte est configurée et que je veux saisir ma position GPS actuelle. J'ai vérifié que mes variables ne sont pas NULL mais mon résultat de:

getLastKnownLocation(provider, false);

Me donne null cependant, alors c'est là que j'ai besoin d'aide. J'ai ajouté des autorisations pour l'emplacement COARSE + FINE. Cependant, toutes sortes de données réseau sont désactivées pour mon téléphone, car je ne suis pas très heureux des dépenses imprévisibles liées aux flux de données dans ma facture de téléphone. Donc, je n'ai que le WiFi activé et connecté pour ce test.

Y a-t-il autre chose que JE DOIS pouvoir activer pour que cela soit possible? Je penserais que le WiFi devrait être suffisant?

68

Utilisez cette méthode pour obtenir le dernier emplacement connu:

LocationManager mLocationManager;
Location myLocation = getLastKnownLocation();

private Location getLastKnownLocation() {
    mLocationManager = (LocationManager)getApplicationContext().getSystemService(LOCATION_SERVICE);
    List<String> providers = mLocationManager.getProviders(true);
    Location bestLocation = null;
    for (String provider : providers) {
        Location l = mLocationManager.getLastKnownLocation(provider);
        if (l == null) {
            continue;
        }
        if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) {
            // Found best last known location: %s", l);
            bestLocation = l;
        }
    }
    return bestLocation;
}
172
TharakaNirmana

vous mélangez les API de nouvel et ancien emplacement quand vous ne devriez pas.

pour obtenir le dernier emplacement connu, il vous suffit d'appeler

compile "com.google.Android.gms:play-services-location:11.0.1"
mLocationClient.getLastLocation();

une fois le service de localisation connecté.

lisez comment utiliser la nouvelle API d'emplacement

http://developer.Android.com/training/location/retrieve-current.html#GetLocation

 private void getLastLocationNewMethod(){
    FusedLocationProviderClient mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
    mFusedLocationClient.getLastLocation()
            .addOnSuccessListener(new OnSuccessListener<Location>() {
                @Override
                public void onSuccess(Location location) {
                    // GPS location can be null if GPS is switched off
                    if (location != null) {
                        getAddress(location);
                    }
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.d("MapDemoActivity", "Error trying to get last GPS location");
                    e.printStackTrace();
                }
            });
}
24
Binesh Kumar

Vous essayez d'obtenir l'emplacement mis en cache auprès du fournisseur de réseau. Vous devez attendre quelques minutes pour obtenir une solution valable. Puisque le cache du fournisseur de réseau est vide, vous obtenez évidemment une valeur nulle là-bas.

5
Sagar Maiyad

Essayez ça marche bien pour moi: -

LocationManager mLocationManager;
Location myLocation = getLastKnownLocation();

        private Location getLastKnownLocation() {
            Location oldLoc;
            while (true){
                oldLoc = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                if (oldLoc == null){
                    continue;
                }
                else {
                    break;
                }
            }
            return oldLoc;
        }

Vous pouvez utiliser NETWORK_PROVIDER à la place de GPS_PROVIDER pour obtenir des résultats plus rapides.

1
Sumit Sinha

Ajouter ce code

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
     return;
}

avant la fonction:

locationManagerObject.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINIMUM_TIME_BETWEEN_UPDATES, MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, new LocationListener()) ainsi que la fonction: locationManagerObject.getLastKnownLocation(LocationManager.GPS_PROVIDER)

0
Krupa Kakkad