getLastKnownLocation restituisce null


85

Ho letto alcune domande su questo, ma non ho trovato una risposta di cui avevo bisogno.

Quindi, il caso è che ho impostato la mia mappa e voglio acquisire la mia posizione GPS corrente. Ho verificato che le mie variabili non siano NULL ma ancora il mio risultato da:

getLastKnownLocation(provider, false);

Tuttavia, mi dà zero, quindi è qui che ho bisogno di aiuto. Ho aggiunto le autorizzazioni per la posizione COARSE + FINE. Ma di solito ho tutti i tipi di dati di rete disabilitati per il mio telefono, perché non sono molto contento delle spese imprevedibili per il flusso di dati nella mia bolletta telefonica. Quindi ho solo WiFi abilitato e connesso per questo test.

C'è qualcos'altro che DEVO abilitare affinché ciò sia possibile? Penso che il WiFi dovrebbe essere sufficiente?


si stia mescolando nuove API e vecchio per getLastLocation seguire questa stackoverflow.com/a/48033659/4997704
Binesh Kumar

Questa risposta è la pena di leggere: stackoverflow.com/a/38794291/5319831
Mohd Naved

Risposte:


194

Usa questo metodo per ottenere l'ultima posizione nota:

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
Risulta che l'ho sempre corretto, ho appena notato un errore che ho trovato una soluzione a questo. Non avevo il telefono impostato per consentire la posizione di Google per il GPS. Quindi, sì. Grazie comunque =)
Aleksander Fimreite

1
Ottima implementazione, molto flessibile. Grazie!
AlexVPerl

2
Funziona come un fascino. Grazie!
erol yeniaras

1
abilitare la posizione nel telefono.
TharakaNirmana

18
la domanda riguarda getLastKnownLocation returns null... questo codice non cambierà nulla ... se per tutti i provider mLocationManager.getLastKnownLocation (poiché può restituire null) restituirà ancora null ... la risposta è ... scusa non puoi evitarlo ... se lo vuoi davvero la posizione non utilizza getLastKnownLocation
Selvin

32

stai mescolando insieme la nuova e la vecchia API di localizzazione quando non dovresti.

per ottenere l'ultima posizione nota tutto ciò che devi fare è chiamare

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

una volta connesso il servizio di localizzazione.

leggi come utilizzare la nuova API di posizione

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

4
Grazie per aver sottolineato che esiste una nuova API. Questa dovrebbe essere la risposta accettata.
Violet Giraffe il

grazie mille questa API è molto più veloce grazie amico non sapevo che esistesse
Tabish

2
Anche qui la posizione restituisce null. Quale può essere il motivo?
JollyRoger

1
controllare il permesso di posizione
Binesh Kumar

D'accordo ... questa dovrebbe essere la risposta accettata. Grazie.
Nicola Salvaro

7

Stai tentando di ottenere il percorso memorizzato nella cache dal provider di rete. Devi aspettare alcuni minuti prima di ottenere una soluzione valida. Poiché la cache del provider di rete è vuota, ovviamente stai ottenendo un valore nullo ..


Va bene, quindi ho bisogno che la mia cache si accumuli? Come posso farlo quando la mia app si arresta in modo anomalo a causa di ciò?
Aleksander Fimreite

1
devi usare il metodo onLocationChanged del listener di posizione. Ottenere una correzione valida richiede tempo (pochi minuti)
Sagar Maiyad

Va bene grazie. Giocherellerei finché non vedo che scoppia un registro =)
Aleksander Fimreite

3
Devo spostarmi con esso anche se non ha nulla memorizzato?
Aleksander Fimreite

1

Aggiungi questo codice

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

prima della funzione:

locationManagerObject.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINIMUM_TIME_BETWEEN_UPDATES, MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, new LocationListener()) così come la funzione: locationManagerObject.getLastKnownLocation(LocationManager.GPS_PROVIDER)


1

Prova questo funziona bene per me: -

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

Puoi utilizzare NETWORK_PROVIDER al posto di GPS_PROVIDER per risultati più rapidi ..


0

Ho riscontrato questo problema in Xamarin.Android.

Location location = locationManager.GetLastKnownLocation(provider);restituiva un valore nullo. Ho controllato il mio codice e ho saputo che avevo appena richiesto l'autorizzazione per ACCESS_COARSE_LOCATION. Ho aggiunto il codice per richiedere l'autorizzazione per ACCESS_FINE_LOCATION e ora non restituiva null. Ecco il mio codice:

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

Nel caso in cui qualcuno proveniente da Xamarin.Android (C #) lo trovasse utile. Per Java o Android Studio il codice sarebbe simile ad alcune piccole modifiche alla sintassi come GetLastKnownLocation()sarà getLastKnownLocation()dato che i nomi dei metodi in Java iniziano con lettere minuscole mentre in C # i nomi dei metodi iniziano con lettere maiuscole.


0

Mi è piaciuta questa soluzione per aggiornare la posizione:

Aggiorna posizione

Nel curriculum, aggiungi la condizione:

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

E forse è un po 'di base, ma controlla che il GPS sia acceso.


-4

Sostituisci la tua linea con

Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.