getLastKnownLocation gibt null zurück


83

Ich habe einige Fragen dazu gelesen, aber ich habe keine Antwort gefunden, die ich brauchte.

Der Fall ist also, dass ich meine Karte eingerichtet habe und meinen aktuellen GPS-Standort abrufen möchte. Ich habe überprüft, dass meine Variablen nicht NULL sind, aber dennoch mein Ergebnis von:

getLastKnownLocation(provider, false);

Gibt mir aber null, also brauche ich hier Hilfe. Ich habe Berechtigungen für den Standort COARSE + FINE hinzugefügt. Normalerweise sind jedoch alle Arten von Netzwerkdaten für mein Telefon deaktiviert, da ich mich nicht über unvorhersehbare Datenflusskosten in meiner Telefonrechnung freue. Daher habe ich für diesen Test nur WLAN aktiviert und verbunden.

Muss ich noch etwas aktivieren, damit dies möglich ist? Ich würde denken, WiFi sollte ausreichen?


Sie mischen neue API und alte für getLastLocation folgen Sie diesem stackoverflow.com/a/48033659/4997704
Binesh Kumar

Diese Antwort ist lesenswert: stackoverflow.com/a/38794291/5319831
Mohd Naved

Antworten:


190

Verwenden Sie diese Methode, um den letzten bekannten Speicherort abzurufen:

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

1
Es stellte sich heraus, dass ich es die ganze Zeit richtig hatte. Ich habe gerade einen Fehler bemerkt, dass ich eine Lösung dafür gefunden habe. Ich hatte mein Telefon nicht so eingestellt, dass Google Position für GPS zugelassen ist. Also ja. Trotzdem danke =)
Aleksander Fimreite

1
Tolle Implementierung, sehr flexibel. Vielen Dank!
AlexVPerl

2
Klappt wunderbar. Vielen Dank!
Erol Yeniaras

1
Standort im Telefon aktivieren.
TharakaNirmana

15
Frage ist über getLastKnownLocation returns null... dieser Code wird nichts ändern ... wenn für alle Anbieter mLocationManager.getLastKnownLocation (da er null zurückgeben kann) er immer noch null zurückgibt ... Antwort ist ... Entschuldigung, Sie können dies nicht vermeiden ... wenn Sie wirklich wollen Der Standort verwendet nicht getLastKnownLocation
Selvin

31

Sie mischen die neuen und die alten Standort-APIs zusammen, wenn Sie dies nicht sollten.

Um den letzten bekannten Ort zu finden, müssen Sie nur anrufen

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

Sobald der Ortungsdienst verbunden war.

Lesen Sie, wie Sie die neue Standort-API verwenden

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

3
Vielen Dank für den Hinweis, dass es eine neue API gibt. Dies sollte die akzeptierte Antwort sein.
Violette Giraffe

Vielen Dank, diese API ist viel schneller, danke Mann, ich wusste nicht, dass es sie gibt
Tabish

1
Location gibt auch hier null zurück. Was kann der Grund sein?
JollyRoger

1
Überprüfen Sie die Standortgenehmigung
Binesh Kumar

Einverstanden ... dies sollte die akzeptierte Antwort sein. Danke dir.
Nicola Salvaro

6

Sie versuchen, den zwischengespeicherten Speicherort vom Netzwerkanbieter abzurufen. Sie müssen einige Minuten warten, bis Sie eine gültige Lösung erhalten. Da der Cache des Netzwerkanbieters leer ist, erhalten Sie dort offensichtlich eine Null.


Okay, also muss mein Cache aufgebaut werden? Wie kann ich das tun, wenn meine App aus diesem Grund abstürzt?
Aleksander Fimreite

1
Sie müssen die onLocationChanged-Methode des Location Listeners verwenden. Das Erhalten eines gültigen
Fixes

Gut, danke. Ich werde herumspielen, bis ich sehe, dass es ein Protokoll knallt =)
Aleksander Fimreite

3
Muss ich mich damit bewegen, auch wenn nichts gespeichert ist?
Aleksander Fimreite

Danke, das ist mir passiert
Andrés Mauricio Gómez

1

Fügen Sie diesen Code hinzu

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

vor der Funktion:

locationManagerObject.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINIMUM_TIME_BETWEEN_UPDATES, MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, new LocationListener()) sowie die Funktion: locationManagerObject.getLastKnownLocation(LocationManager.GPS_PROVIDER)


1

Versuchen Sie dies, es funktioniert gut für mich: -

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

Sie können NETWORK_PROVIDER anstelle von GPS_PROVIDER verwenden, um schnellere Ergebnisse zu erzielen.


0

Ich hatte dieses Problem in Xamarin.Android.

Location location = locationManager.GetLastKnownLocation(provider);gab den Nullwert zurück. Ich überprüfte meinen Code und erfuhr, dass ich gerade die Erlaubnis für ACCESS_COARSE_LOCATION angefordert hatte. Ich habe Code hinzugefügt, um die Berechtigung für ACCESS_FINE_LOCATION anzufordern, und jetzt wurde nicht null zurückgegeben. Hier ist mein Code:

void AskPermissions()
{
    if (CheckSelfPermission(Manifest.Permission.AccessCoarseLocation) != (int)Permission.Granted ||
            CheckSelfPermission(Manifest.Permission.AccessFineLocation) != (int)Permission.Granted)
        RequestPermissions(new string[] { Manifest.Permission.AccessCoarseLocation, Manifest.Permission.AccessFineLocation }, 0);
    else
        GetLocation();
}

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
    if (CheckSelfPermission(Manifest.Permission.AccessCoarseLocation) == (int)Permission.Granted &&
            CheckSelfPermission(Manifest.Permission.AccessFineLocation) == (int)Permission.Granted)
        GetLocation();
    else
        Log.Info(tag, "Permission not Granted: Please enter desired Location manually.");
}

void GetLocation()
{
    locationManager = (LocationManager)GetSystemService(LocationService);
    provider = locationManager.GetBestProvider(new Criteria(), false);
    Location location = locationManager.GetLastKnownLocation(provider);
    if (location != null)
        Log.Info(tag, "Location Lat: " + location.Latitude + " Lon: " + location.Longitude);
    else
        Log.Info(tag, "Location is null");
}

Für den Fall, dass jemand von Xamarin.Android (C #) kommt, würde es nützlich sein. Für Java oder Android Studio wäre der Code mit einigen geringfügigen Syntaxänderungen ähnlich GetLastKnownLocation(), getLastKnownLocation()da Methodennamen in Java mit Kleinbuchstaben beginnen, während Methodennamen in C # mit Großbuchstaben beginnen.


0

Ich mochte diese Lösung, um den Standort zu aktualisieren:

Standort aktualisieren

Fügen Sie im Lebenslauf die Bedingung hinzu:

Location myLocation = getLastKnownLocation();
if (myLocation == null) {
      locationManager.requestLocationUpdates(
      LocationManager.PASSIVE_PROVIDER,
      MIN_TIME_BW_UPDATES,
      MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
      Log.d("GPS", "GPS Enabled");
 }

Und vielleicht ist einige grundlegende, aber überprüfen Sie, ob GPS eingeschaltet ist.


-4

Ersetzen Sie Ihre Leitung durch

Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.