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.