У меня есть рабочее решение для точно такой же вещи, которая выглядит следующим образом:
В вашем методе OnCreate проверьте существующие разрешения:
if (!(CheckPermissionGranted(Manifest.Permission.AccessCoarseLocation)
&&(CheckPermissionGranted(Manifest.Permission.AccessBackgroundLocation)
&& CheckPermissionGranted(Manifest.Permission.AccessFineLocation)))
{
RequestLocationPermission();
}
else
{
InitializeLocationManager();
}
InitPageWidgets();
Где Проверка разрешения Предоставлено - это методчто-то вроде этого:
[Export]
public bool CheckPermissionGranted(string Permissions)
{
// Check if the permission is already available.
if (ActivityCompat.CheckSelfPermission(this, Permissions) != Permission.Granted)
{
return false;
}
else
{
return true;
}
}
И код разрешения запроса выглядит примерно так:
private void RequestLocationPermission()
{
if (ActivityCompat.ShouldShowRequestPermissionRationale(this, Manifest.Permission.AccessFineLocation))
{
// Provide an additional rationale to the user if the permission was not granted
// and the user would benefit from additional context for the use of the permission.
// For example if the user has previously denied the permission.
ActivityCompat.RequestPermissions(this, PermissionsLocation, REQUEST_LOCATION);
}
else
{
// Camera permission has not been granted yet. Request it directly.
ActivityCompat.RequestPermissions(this, PermissionsLocation, REQUEST_LOCATION);
}
}
Как только вы примете или отклоните это разрешение, этот метод будет вызван:
public override void OnRequestPermissionsResult(int requestCode, string[] permissions,
Android.Content.PM.Permission[] grantResults)
{
Log.Info(Tag, "onRequestPermissionResult");
if (requestCode == RequestPermissionsRequestCode)
{
if (grantResults.Length <= 0)
{
// If user interaction was interrupted, the permission request is cancelled and you
// receive empty arrays.
Log.Info(Tag, "User interaction was cancelled.");
}
else if (grantResults[0] == PermissionChecker.PermissionGranted)
{
// Permission was granted.
}
else
{
// Permission denied.
Toast.MakeText(this, "Permission Denied", ToastLength.Long).Show();
}
}
}
Обратите внимание, что это доступно только в последней версии Xamarin с VS 2019