Miałem ten problem w Xamarin.Android.
Location location = locationManager.GetLastKnownLocation(provider);
zwracał wartość null. Sprawdziłem swój kod i dowiedziałem się, że właśnie poprosiłem o pozwolenie na ACCESS_COARSE_LOCATION. Dodałem kod, aby poprosić o pozwolenie na ACCESS_FINE_LOCATION i teraz nie zwracał null. Oto mój kod:
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");
}
Na wypadek, gdyby ktoś pochodzący z platformy Xamarin.Android (C #) uznałby to za przydatne. Java lub Android Studio kod byłby podobny withs niektóre drobne Składnia zmienia jak GetLastKnownLocation()
będzie getLastKnownLocation()
jako nazwy metod w Javie zacząć od małych liter podczas gdy w C # metoda nazwy zaczynają się literami wielkimi literami.