getLastKnownLocation zwraca wartość null

84

Przeczytałem kilka pytań na ten temat, ale nie znalazłem odpowiedzi, której potrzebowałem.

Tak więc sprawa jest taka, że ​​mam skonfigurowaną mapę i chcę pobrać aktualną lokalizację GPS. Sprawdziłem, czy moje zmienne nie są NULL, ale mój wynik z:

getLastKnownLocation(provider, false);

Daje mi jednak zero, więc tutaj potrzebuję pomocy. Dodałem uprawnienia do lokalizacji COARSE + FINE. Ale zwykle mam wyłączone wszystkie rodzaje danych sieciowych w moim telefonie, ponieważ nie jestem zadowolony z nieprzewidywalnych wydatków na przepływ danych na moim rachunku telefonicznym. Więc mam tylko WiFi włączone i podłączone do tego testu.

Czy jest coś więcej, co MUSZĘ włączyć, aby było to możliwe? Myślę, że WiFi powinno być wystarczające?

Aleksander Fimreite
źródło
mieszasz nowy i stary interfejs API dla getLastLocation, wykonaj ten stackoverflow.com/a/48033659/4997704
Binesh Kumar
Warto przeczytać tę odpowiedź: stackoverflow.com/a/38794291/5319831
Mohd Naved

Odpowiedzi:

194

Użyj tej metody, aby uzyskać ostatnią znaną lokalizację:

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;
}
TharakaNirmana
źródło
1
Okazuje się, że przez cały czas było dobrze, właśnie zauważyłem błąd, że znalazłem rozwiązanie tego problemu. Mój telefon nie był ustawiony na zezwalanie na Google Position dla GPS. Więc tak. Dzięki mimo wszystko =)
Aleksander Fimreite
1
Świetna realizacja, bardzo elastyczna. Dzięki!
AlexVPerl
2
Działa jak marzenie. Dzięki!
erol yeniaras,
1
włączyć lokalizację w telefonie.
TharakaNirmana,
17
pytanie dotyczy getLastKnownLocation returns null... ten kod nic nie zmieni ... jeśli dla wszystkich dostawców mLocationManager.getLastKnownLocation (ponieważ może zwrócić wartość null) nadal zwróci wartość null ... odpowiedź brzmi ... przepraszam, nie możesz tego uniknąć ... jeśli naprawdę chcesz lokalizacja nie używa getLastKnownLocation
Selvin
32

mieszasz razem nowe i stare interfejsy API lokalizacji, a nie powinieneś.

aby uzyskać ostatnią znaną lokalizację, wystarczy zadzwonić

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

po podłączeniu usługi lokalizacyjnej.

przeczytaj, jak korzystać z nowego interfejsu API lokalizacji

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();
                }
            });
}
Binesh Kumar
źródło
4
Dziękujemy za wskazanie, że jest nowe API. To powinna być akceptowana odpowiedź.
Violet Giraffe
dziękuję bardzo, ten interfejs API jest znacznie szybszy, dzięki stary, nie wiedziałem, że istnieje
Tabish
1
Lokalizacja również tutaj zwraca wartość null. Jaki może być tego powód?
JollyRoger
1
check Pozwolenie na lokalizację
Binesh Kumar
Zgoda ... to powinna być akceptowana odpowiedź. Dziękuję Ci.
Nicola Salvaro,
7

Próbujesz uzyskać buforowaną lokalizację od dostawcy sieci. Musisz poczekać kilka minut, aż otrzymasz prawidłową poprawkę. Ponieważ pamięć podręczna dostawcy sieci jest pusta, oczywiście otrzymujesz tam wartość null.

Sagar Maiyad
źródło
W porządku, więc potrzebuję mojej pamięci podręcznej? Jak mogę to zrobić, gdy moja aplikacja ulegnie awarii z tego powodu?
Aleksander Fimreite
1
musisz użyć metody onLocationChanged nasłuchiwania lokalizacji. Uzyskanie poprawnej poprawki zajmuje trochę czasu (kilka minut)
Sagar Maiyad,
W porządku, dzięki. Będę się bawić, aż zobaczę, jak wyskakuje dziennik =)
Aleksander Fimreite
3
Czy muszę się z nim poruszać, nawet jeśli nic na nim nie ma?
Aleksander Fimreite
1

Dodaj ten kod

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

przed funkcją:

locationManagerObject.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINIMUM_TIME_BETWEEN_UPDATES, MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, new LocationListener()) a także funkcję: locationManagerObject.getLastKnownLocation(LocationManager.GPS_PROVIDER)

Krupa Kakkad
źródło
1

Spróbuj tego, to działa dobrze dla mnie: -

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

Możesz użyć NETWORK_PROVIDER zamiast GPS_PROVIDER, aby uzyskać szybsze wyniki.

Sumit Sinha
źródło
0

Miałem ten problem w Xamarin.Android.

Location location = locationManager.GetLastKnownLocation(provider);zwracał wartość null. Sprawdziłem swój kod i dowiedziałem się, że właśnie poprosiłem o pozwolenie na ACCESS_COARSE_LOCATION. Dodałem kod, aby poprosić o pozwolenie na ACCESS_FINE_LOCATION i teraz nie zwracał null. Oto mój kod:

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

Na wypadek, gdyby ktoś pochodzący z platformy Xamarin.Android (C #) uznałby to za przydatne. Java lub Android Studio kod byłby podobny withs niektóre drobne Składnia zmienia jak GetLastKnownLocation()będzie getLastKnownLocation()jako nazwy metod w Javie zacząć od małych liter podczas gdy w C # metoda nazwy zaczynają się literami wielkimi literami.

Juned Khan Momin
źródło
0

Podobało mi się to rozwiązanie do aktualizacji lokalizacji:

Zaktualizuj lokalizację

W wznowieniu dodaj warunek:

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

I może jest trochę podstawowe, ale sprawdź, czy GPS jest włączony.

PJ Alzab
źródło
-4

Zamień linię na

Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
Deepak Vajpayee
źródło