我想用 xamarin.forms 获得每一帧的当前位置
i want to get my current position every frame with xamarin.forms
当我调用该函数时,我有一次我的位置,但我想在 app.I 中的每一帧都获得我的位置,这意味着当我随着 phone 移动时,位置会发生变化。我试过 while(true) 但没有用。
当我在主函数中调用它时。它将 运行 一次。这是我的职责。
public async Task<Location> GetCurrentLocation()
{
var p = new Location();
try
{
var request = new GeolocationRequest(GeolocationAccuracy.Medium, TimeSpan.FromSeconds(10));
cts = new CancellationTokenSource();
var location = await Geolocation.GetLocationAsync(request, cts.Token);
if (location != null)
{
Console.WriteLine($"Latitude: {location.Latitude}, Longitude: {location.Longitude}, Altitude: {location.Altitude}");
map.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(location.Latitude, location.Longitude), Distance.FromMeters(100)));
}
return location;
}
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");
}
return p;
}
使用 GeoLocator 插件
async Task StartListening()
{
if(CrossGeolocator.Current.IsListening)
return;
await CrossGeolocator.Current.StartListeningAsync(TimeSpan.FromSeconds(5), 10, true);
CrossGeolocator.Current.PositionChanged += PositionChanged;
CrossGeolocator.Current.PositionError += PositionError;
}
private void PositionChanged(object sender, PositionEventArgs e)
{
//If updating the UI, ensure you invoke on main thread
var position = e.Position;
var output = "Full: Lat: " + position.Latitude + " Long: " + position.Longitude;
output += "\n" + $"Time: {position.Timestamp}";
output += "\n" + $"Heading: {position.Heading}";
output += "\n" + $"Speed: {position.Speed}";
output += "\n" + $"Accuracy: {position.Accuracy}";
output += "\n" + $"Altitude: {position.Altitude}";
output += "\n" + $"Altitude Accuracy: {position.AltitudeAccuracy}";
Debug.WriteLine(output);
}
private void PositionError(object sender, PositionErrorEventArgs e)
{
Debug.WriteLine(e.Error);
//Handle event here for errors
}
async Task StopListening()
{
if(!CrossGeolocator.Current.IsListening)
return;
await CrossGeolocator.Current.StopListening);
CrossGeolocator.Current.PositionChanged -= PositionChanged;
CrossGeolocator.Current.PositionError -= PositionError;
}
当我调用该函数时,我有一次我的位置,但我想在 app.I 中的每一帧都获得我的位置,这意味着当我随着 phone 移动时,位置会发生变化。我试过 while(true) 但没有用。 当我在主函数中调用它时。它将 运行 一次。这是我的职责。
public async Task<Location> GetCurrentLocation()
{
var p = new Location();
try
{
var request = new GeolocationRequest(GeolocationAccuracy.Medium, TimeSpan.FromSeconds(10));
cts = new CancellationTokenSource();
var location = await Geolocation.GetLocationAsync(request, cts.Token);
if (location != null)
{
Console.WriteLine($"Latitude: {location.Latitude}, Longitude: {location.Longitude}, Altitude: {location.Altitude}");
map.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(location.Latitude, location.Longitude), Distance.FromMeters(100)));
}
return location;
}
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");
}
return p;
}
使用 GeoLocator 插件
async Task StartListening()
{
if(CrossGeolocator.Current.IsListening)
return;
await CrossGeolocator.Current.StartListeningAsync(TimeSpan.FromSeconds(5), 10, true);
CrossGeolocator.Current.PositionChanged += PositionChanged;
CrossGeolocator.Current.PositionError += PositionError;
}
private void PositionChanged(object sender, PositionEventArgs e)
{
//If updating the UI, ensure you invoke on main thread
var position = e.Position;
var output = "Full: Lat: " + position.Latitude + " Long: " + position.Longitude;
output += "\n" + $"Time: {position.Timestamp}";
output += "\n" + $"Heading: {position.Heading}";
output += "\n" + $"Speed: {position.Speed}";
output += "\n" + $"Accuracy: {position.Accuracy}";
output += "\n" + $"Altitude: {position.Altitude}";
output += "\n" + $"Altitude Accuracy: {position.AltitudeAccuracy}";
Debug.WriteLine(output);
}
private void PositionError(object sender, PositionErrorEventArgs e)
{
Debug.WriteLine(e.Error);
//Handle event here for errors
}
async Task StopListening()
{
if(!CrossGeolocator.Current.IsListening)
return;
await CrossGeolocator.Current.StopListening);
CrossGeolocator.Current.PositionChanged -= PositionChanged;
CrossGeolocator.Current.PositionError -= PositionError;
}