I have a Xamarin Forms app where I am trying to get location of the phone using Xamarin Essentials. App targets Android version 11 (API 30). I have provided all the location permissions in manifest file. It works fine below Android 11 but having issue with Android 11.
Every request to var location = await Geolocation.GetLocationAsync(new GeolocationRequest(GeolocationAccuracy.Medium));
returns null.
Below is the code to request permission and location:
private async Task locationPermission()
{
try
{
PermissionStatus whenInUsePermission = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();
if (whenInUsePermission != PermissionStatus.Granted)
{
whenInUsePermission = await Permissions.RequestAsync<Permissions.LocationWhenInUse>();
}
PermissionStatus locationAlwaysPermission = await Permissions.CheckStatusAsync<Permissions.LocationAlways>();
if (locationAlwaysPermission != PermissionStatus.Granted)
{
locationAlwaysPermission = await Permissions.RequestAsync<Permissions.LocationAlways>();
}
if (whenInUsePermission == PermissionStatus.Granted || locationAlwaysPermission == PermissionStatus.Granted)
{
// do something
await GetDeviceLocation();
}
}
catch (Exception ex)
{
}
}
public async Task GetDeviceLocation()
{
try
{
PermissionStatus status = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();
if (status != PermissionStatus.Granted)
{
PermissionStatus results = await Permissions.RequestAsync<Permissions.LocationWhenInUse>();
}
if (status == PermissionStatus.Granted)
{
var location = await Geolocation.GetLocationAsync(new GeolocationRequest(GeolocationAccuracy.Medium));
}
}
catch (Exception ex)
{
}
}
I have given below permissions in the manifest file:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-feature android:name="android.hardware.location" android:required="false" />
<uses-feature android:name="android.hardware.location.gps" android:required="false" />
<uses-feature android:name="android.hardware.location.network" android:required="false" />