[英]Xamarin.Forms: Map.IsShowingUser not showing current location?
[英]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.