getLastKnownLocation devuelve nulo

84

Leí algunas preguntas sobre esto, pero no encontré la respuesta que necesitaba.

Entonces, el caso es que tengo mi mapa configurado y quiero tomar mi ubicación actual de GPS. He comprobado que mis variables no son NULL pero mi resultado de:

getLastKnownLocation(provider, false);

Sin embargo, me da nulo, así que aquí es donde necesito ayuda. He añadido permisos para la ubicación COARSE + FINE. Pero generalmente tengo todo tipo de datos de red deshabilitados para mi teléfono, porque no estoy muy contento con los gastos impredecibles del flujo de datos en mi factura telefónica. Así que solo tengo WiFi habilitado y conectado para esta prueba.

¿Hay algo más que NECESITO habilitar para que esto sea posible? ¿Creo que WiFi debería ser suficiente?

Aleksander Fimreite
fuente
está mezclando api nueva y antigua para getLastLocation, siga esto stackoverflow.com/a/48033659/4997704
Binesh Kumar
Vale la pena leer esta respuesta: stackoverflow.com/a/38794291/5319831
Mohd Naved el

Respuestas:

194

Utilice este método para obtener la última ubicación conocida:

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
fuente
1
Resulta que lo tenía correcto todo el tiempo, acabo de notar un error y encontré una solución para esto. No tenía mi teléfono configurado para permitir la posición de Google para GPS. Así que sí. Gracias de todos modos =)
Aleksander Fimreite
1
Gran implementación, muy flexible. ¡Gracias!
AlexVPerl
2
Funciona de maravilla. ¡Gracias!
erol yeniaras
1
habilitar la ubicación en el teléfono.
TharakaNirmana
17
la pregunta es sobre getLastKnownLocation returns null... este código no cambiará nada ... si para todos los proveedoresmLocationManager.getLastKnownLocation (ya que puede devolver nulo) todavía devolverá nulo ... la respuesta es ... lo siento, no puede evitar esto ... si realmente quiere la ubicación no usa getLastKnownLocation
Selvin
32

está mezclando la API de ubicación nueva y la antigua cuando no debería.

para obtener la última ubicación conocida, todo lo que tienes que hacer es llamar

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

una vez que se conectó el servicio de ubicación.

lea cómo usar la nueva API de ubicación

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
fuente
4
Gracias por señalar que hay una nueva API. Esta debería ser la respuesta aceptada.
Jirafa violeta
muchas gracias, esta API es mucho más rápida gracias, hombre, no sabía que existía
Tabish
1
La ubicación también devuelve nulo aquí. cual puede ser la razon?
JollyRoger
1
comprobar el permiso de ubicación
Binesh Kumar
De acuerdo ... esta debería ser la respuesta aceptada. Gracias.
Nicola Salvaro
7

Está intentando obtener la ubicación en caché del proveedor de red. Tienes que esperar unos minutos hasta que obtengas una solución válida. Dado que la caché del proveedor de red está vacía, obviamente obtendrá un valor nulo allí ...

Sagar Maiyad
fuente
Muy bien, ¿entonces necesito que mi caché se acumule? ¿Cómo puedo hacer eso cuando mi aplicación falla debido a esto?
Aleksander Fimreite
1
tienes que usar el método onLocationChanged del detector de ubicación. Obtener una solución válida lleva tiempo (unos minutos)
Sagar Maiyad
OK gracias. Tocaré el violín hasta que lo vea hacer estallar un registro =)
Aleksander Fimreite
3
¿Tengo que moverme con él incluso si no tiene nada almacenado?
Aleksander Fimreite
1

Agregar este código

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

antes de la función:

locationManagerObject.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINIMUM_TIME_BETWEEN_UPDATES, MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, new LocationListener()) así como la función: locationManagerObject.getLastKnownLocation(LocationManager.GPS_PROVIDER)

Krupa Kakkad
fuente
1

Prueba esto, funciona bien para mí: -

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

Puede utilizar NETWORK_PROVIDER en lugar de GPS_PROVIDER para obtener resultados más rápidos.

Sumit Sinha
fuente
0

Tuve este problema en Xamarin.Android.

Location location = locationManager.GetLastKnownLocation(provider);estaba devolviendo un valor nulo. Revisé mi código y supe que acababa de solicitar permiso para ACCESS_COARSE_LOCATION. Agregué código para solicitar permiso para ACCESS_FINE_LOCATION y ahora no devolvía nulo. Aquí está mi código:

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

En caso de que alguien que venga de Xamarin.Android (C #) lo encuentre útil. Para Java o Android Studio, el código sería similar con algunos cambios de sintaxis menores GetLastKnownLocation(), getLastKnownLocation()como los nombres de métodos en Java comienzan con letras minúsculas, mientras que en C # los nombres de métodos comienzan con letras mayúsculas.

Juned Khan Momin
fuente
0

Me gustó esta solución para actualizar la ubicación:

Actualizar ubicación

En resumen, agregue la condición:

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

Y tal vez sea algo básico, pero compruebe que el GPS esté encendido.

PJ Alzab
fuente
-4

Reemplaza tu línea con

Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
Deepak Vajpayee
fuente