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?
android
google-maps
location
Aleksander Fimreite
fuente
fuente
Respuestas:
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; }
fuente
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 getLastKnownLocationestá 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(); } }); }
fuente
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í ...
fuente
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)
fuente
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.
fuente
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.fuente
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.
fuente
Reemplaza tu línea con
fuente