C# 使用Xamarin返回0获取当前gps位置
我试图通过Xamarin在Android上获得我的当前位置。我使用谷歌地图和以下代码:C# 使用Xamarin返回0获取当前gps位置,c#,android,xamarin,geolocation,gps,C#,Android,Xamarin,Geolocation,Gps,我试图通过Xamarin在Android上获得我的当前位置。我使用谷歌地图和以下代码: using System; using System.ComponentModel; using System.Threading.Tasks; using Xamarin.Essentials; using Xamarin.Forms; using Xamarin.Forms.Maps; namespace WorldHerp { [DesignTimeVisible(false)] pu
using System;
using System.ComponentModel;
using System.Threading.Tasks;
using Xamarin.Essentials;
using Xamarin.Forms;
using Xamarin.Forms.Maps;
namespace WorldHerp
{
[DesignTimeVisible(false)]
public partial class MainPage : ContentPage
{
private double _latitude = 0.0;
private double _longitude = 0.0;
public MainPage()
{
InitializeComponent();
Task.Run(async () => { await GetCurrentLocationAsync(); });
MapView.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(_latitude, _longitude), Distance.FromKilometers(1)).WithZoom(20));
}
private async Task GetCurrentLocationAsync()
{
try
{
var location = await Geolocation.GetLocationAsync();
if (location != null)
{
_latitude = location.Latitude;
_longitude = location.Longitude;
}
}
catch (FeatureNotSupportedException fnsEx)
{
await DisplayAlert("Faild", fnsEx.Message, "OK");
}
catch (PermissionException pEx)
{
await DisplayAlert("Faild", pEx.Message, "OK");
}
catch (Exception ex)
{
await DisplayAlert("Faild", ex.Message, "OK");
}
}
}
}
对于我的_latitude/_longitude变量,它们只返回0。我试着调试一下{}就好像他从来没有进去过,但没有告诉我任何错误
你知道吗
感谢每一个advance您需要一个异步非空方法来等待结果 >
使用系统;
使用系统组件模型;
使用System.Threading.Tasks;
使用Xamarin.Essentials;
使用Xamarin.Forms;
使用Xamarin.Forms.Maps;
命名空间WorldHerp
{
[设计时间可见(错误)]
公共部分类主页:ContentPage
{
公共主页()
{
初始化组件();
}
受保护的异步重写void OnAppearing()
{
var position=等待GetCurrentLocationAsync();
MapView.MoveToRegion(MapSpan.FromCenterAndRadius((位置!=null?
职位:
新位置(0.0,0.0)),
距离。从公里数(1)),使用缩放(20));
base.OnAppearing();
}
专用异步任务GetCurrentLocationAsync()
{
尝试
{
返回wait-Geolocation.GetLocationAsync();
}
捕获(功能不支持异常fnsEx)
{
等待显示警报(“失败”,fnsEx.Message,“OK”);
}
捕获(许可异常pEx)
{
等待显示警报(“故障”,pEx.信息,“正常”);
}
捕获(例外情况除外)
{
等待显示警报(“故障”,例如消息“正常”);
}
}
}
}
您需要一个异步非空方法来等待结果
>
使用系统;
使用系统组件模型;
使用System.Threading.Tasks;
使用Xamarin.Essentials;
使用Xamarin.Forms;
使用Xamarin.Forms.Maps;
命名空间WorldHerp
{
[设计时间可见(错误)]
公共部分类主页:ContentPage
{
公共主页()
{
初始化组件();
}
受保护的异步重写void OnAppearing()
{
var position=等待GetCurrentLocationAsync();
MapView.MoveToRegion(MapSpan.FromCenterAndRadius((位置!=null?
职位:
新位置(0.0,0.0)),
距离。从公里数(1)),使用缩放(20));
base.OnAppearing();
}
专用异步任务GetCurrentLocationAsync()
{
尝试
{
返回wait-Geolocation.GetLocationAsync();
}
捕获(功能不支持异常fnsEx)
{
等待显示警报(“失败”,fnsEx.Message,“OK”);
}
捕获(许可异常pEx)
{
等待显示警报(“故障”,pEx.信息,“正常”);
}
捕获(例外情况除外)
{
等待显示警报(“故障”,例如消息“正常”);
}
}
}
}
问题在于任务。Run正在异步运行,因此您永远不会等待获取位置。删除async。但是,这一行是异步的,我显然有异步方法:var location=await Geolocation.GetLocationAsync();它不会等待。异步创建一个单独的进程,然后立即转到MoveToRegion。但是GetLocationAsync希望“等待”。如何编写这样的代码?然后使用GetCurrentLocation()而不是GetCurrentLocationAsync()。问题在于任务。Run正在异步运行,因此您永远不会等待获取位置。删除async。但是,这一行是异步的,我显然有异步方法:var location=await Geolocation.GetLocationAsync();它不会等待。异步创建一个单独的进程,然后立即转到MoveToRegion。但是GetLocationAsync希望“等待”。如何编写这样的代码?然后使用GetCurrentLocation()而不是GetCurrentLocationAsync()
using System;
using System.ComponentModel;
using System.Threading.Tasks;
using Xamarin.Essentials;
using Xamarin.Forms;
using Xamarin.Forms.Maps;
namespace WorldHerp
{
[DesignTimeVisible(false)]
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
protected async override void OnAppearing()
{
var position = await GetCurrentLocationAsync();
MapView.MoveToRegion(MapSpan.FromCenterAndRadius((position != null ?
position :
new Position(0.0, 0.0)),
Distance.FromKilometers(1)).WithZoom(20));
base.OnAppearing();
}
private async Task<Xamarin.Essentials.Location> GetCurrentLocationAsync()
{
try
{
return await Geolocation.GetLocationAsync();
}
catch (FeatureNotSupportedException fnsEx)
{
await DisplayAlert("Faild", fnsEx.Message, "OK");
}
catch (PermissionException pEx)
{
await DisplayAlert("Faild", pEx.Message, "OK");
}
catch (Exception ex)
{
await DisplayAlert("Faild", ex.Message, "OK");
}
}
}
}