studio permissionstatus permissionsimplementation permission not for exist does checkselfpermission ask access_fine_location access_coarse_location c# android xamarin xamarin.forms android-permissions

c# - permissionstatus - Cómo solicitar permiso de ubicación antes de mostrar la configuración del mapa en Xaml. Xamarin.Forms



xamarin forms permissions (1)

Recientemente actualicé el nivel de SDK a 6.0 en Xamarin.forms. Usé Xaml para colocar un mapa en una página. Desde que actualicé a 6.0, se requiere permiso para mostrar el mapa. Mi problema ahora es que no puedo encontrar la manera de solicitar permiso para mostrar el mapa antes de que la aplicación intente mostrarlo. Como resultado, recibo una excepción no controlada.

public MapPage() { Init(); InitializeComponent(); azureService = AzureService.defaultManager; } private async Task Init() { await RequestLocationPermission(); } protected async override void OnAppearing() { base.OnAppearing(); MyMap.MoveToRegion( MapSpan.FromCenterAndRadius( new Position(0, 0), Distance.FromMiles(10.0))); } private async Task RequestLocationPermission() { try { var status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Location); if (status != PermissionStatus.Granted) { if (await CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Permission.Location)) { await DisplayAlert("Need location", "Gunna need that location", "OK"); } var results = await CrossPermissions.Current.RequestPermissionsAsync(new[] { Permission.Location }); status = results[Permission.Location]; } if (status == PermissionStatus.Granted) { } else if (status != PermissionStatus.Unknown) { await DisplayAlert("Location Denied", "Can not continue, try again.", "OK"); } } catch (Exception ex) { } }

Si el mapa está configurado en Xaml, ¿cómo puedo solicitar permiso antes de mostrarlo?


La forma en que su constructor está configurado en este momento, está iniciando la solicitud de permiso en una tarea que se ejecutará en un hilo separado. Eso significa que InitializeComponent () probablemente se ejecutará antes de que el usuario pueda otorgar el permiso. El problema es que no puedes hacer que el constructor sea un método asíncrono, así que no hay una manera fácil de evitar esto.

Para que esto funcione sin demasiado esfuerzo, puede mover InitializeComponent () desde su constructor a su bloque "if (status == PermissionStatus.Granted)". Probablemente se vería algo como esto:

if (status == PermissionStatus.Granted) { Device.BeginInvokeOnMainThread(() => { InitializeComponent() }); }

Con este enfoque, tendrás que tener cuidado con lo que haces en OnAppearing () ya que probablemente se invocará antes de InitializeComponent (). Si intenta acceder a cualquiera de sus componentes de interfaz de usuario en ese punto, fallará.

Sin embargo, creo que la mejor manera de manejar esto es mover su código de solicitud de permiso un nivel más arriba. En otras palabras, colócalo en la clase desde la que estás instanciando esta página. Luego, puede mostrar esta página si se concede acceso, u otra página que no tiene el mapa si se deniega el acceso. Haría una mejor experiencia de usuario.