繁体   English   中英

在显示Xaml中设置的地图之前如何请求位置权限。 Xamarin表格

[英]How to Request Location permission before showing map set up in Xaml. Xamarin.Forms

我最近在Xamarin.forms中将sdk级别更新为6.0。 我使用Xaml将地图放置在页面上。 由于我已更新至6.0,因此需要具有显示地图的权限。 我现在的问题是,在应用尝试显示地图之前,我不知道如何请求显示地图的权限。 结果,我得到了一个未处理的异常。

 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)
            {

            }
        }

如果地图是在Xaml中设置的,那么在显示地图之前我该如何请求权限?

现在设置构造函数的方式是,在一个将在单独线程中运行的任务中启动权限请求。 这意味着InitializeComponent()可能会在用户授予权限之前运行。 问题是您不能使构造函数成为异步方法,因此没有简单的方法可以解决此问题。

为了使此工作轻松进行,您可以将InitializeComponent()从构造函数移动到“ if(status == PermissionStatus.Granted)”块中。 它可能看起来像这样:

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

使用这种方法时,您将必须小心在OnAppearing()中执行的操作,因为它可能在InitializeComponent()之前被调用。 如果您此时尝试访问任何UI组件,它将失败。

但是,我认为处理此问题的更好方法是将您的权限请求代码上移一个级别。 换句话说,将其放在实例化此页面的类中。 然后,如果授予访问权限,则可以显示此页面;如果拒绝访问,则可以显示不具有地图的另一个页面。 这将带来更好的用户体验。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM