У мене була ця проблема в Xamarin.Android.
Location location = locationManager.GetLastKnownLocation(provider);
повертало нульове значення. Я перевірив свій код і дізнався, що щойно запитував дозвіл на ACCESS_COARSE_LOCATION. Я додав код для запиту дозволу на ACCESS_FINE_LOCATION, і тепер він не повертає null. Ось мій код:
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");
}
На випадок, якщо хтось із Xamarin.Android (C #) знайде це корисно. Для Java або Android Studio код буде схожий з деякими незначними змінами синтаксису, як, наприклад GetLastKnownLocation()
, getLastKnownLocation()
як імена методів у Java починаються з малих літер, тоді як у методах C # імена починаються з великих літер.