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.