首页 > 解决方案 > 我想用 xamarin.forms 获得每帧的当前位置

问题描述

当我调用该函数时,我有一次我的位置,但我想在应用程序中的每一帧都获得我的位置。我的意思是当我用手机移动时,位置会改变。我试图做 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;
    }

标签: c#xamarinxamarin.formsxamarin.android

解决方案


使用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;
}

推荐阅读