【问题标题】:CrossGeolocator's GetPositionAsync does not workCrossGeolocator 的 GetPositionAsync 不起作用
【发布时间】:2017-01-20 12:18:48
【问题描述】:

我正在使用 CrossGeolocator 来检索设备的当前纬度和经度。但是我在 OnAppearing 覆盖方法中使用它并且它不起作用。 GetPositionAsync 方法挂起应用程序。

 protected override void OnAppearing()
 {
     base.OnAppearing();

     var position = GetPosition().Result;
     var lat = position.Latitude;
     var lon = position.Longitude;
 }

 private static async Task<Position> GetPosition()
 {
     var locator = CrossGeolocator.Current;
     locator.DesiredAccuracy = 50;

     var position = await locator.GetPositionAsync(10000);
     return position;
 }

细节是我在应用程序的按钮中使用了相同的 GetPosition 方法并且效果很好。

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: c# mobile xamarin


    【解决方案1】:

    试试这个:

    创建一个全局变量:

    private Position _position;
    

    然后调用你的方法来获取构造函数的位置。 像这样重写你的方法:

    public async void GetPosition()
    {
        var locator = CrossGeolocator.Current;
        locator.DesiredAccuracy = 50;
        var myPosition = await locator.GetPositionAsync();
        _position = new Position(myPosition.Latitude, myPosition.Longitude);
    }
    

    然后在你想用这个的地方花点时间:

    while(_position == new Postion(0,0))
          GetPosition();
    

    【讨论】:

    • 非常感谢你
    • 嗨,我在 xamarin android 项目中尝试了上述代码时遇到任务取消异常。
    【解决方案2】:

    这对我有用。

    按照链接中的说明设置 xamarin 表单映射。 https://developer.xamarin.com/guides/xamarin-forms/user-interface/map/

    按照以下链接设置权限 https://jamesmontemagno.github.io/GeolocatorPlugin/GettingStarted.html

    您可以使用https://jamesmontemagno.github.io/GeolocatorPlugin/CurrentLocation.html

    using Plugin.Geolocator;
    using System;
    using Xamarin.Forms;
    using Xamarin.Forms.Maps;
    using Xamarin.Forms.Xaml;
    namespace MapApp
    {
        [XamlCompilation(XamlCompilationOptions.Compile)]
        public partial class MapPage : ContentPage
        {
            private Position _position;
            public MapPage()
            {
                InitializeComponent();
    
                var map = new Map(
                  MapSpan.FromCenterAndRadius(
                          new Position(37, -122), Distance.FromMiles(0.3)))
                {
                    IsShowingUser = true,
                    HeightRequest = 100,
                    WidthRequest = 960,
                    VerticalOptions = LayoutOptions.FillAndExpand
                };
    
    
    
                if (IsLocationAvailable())
                {
                    GetPosition();
                    map.MoveToRegion(MapSpan.FromCenterAndRadius(_position, Distance.FromMiles(1)));
    
                }
    
                map.MapType = MapType.Street;
                var stack = new StackLayout { Spacing = 0 };
                stack.Children.Add(map);
                Content = stack;
    
            }
    
            public bool IsLocationAvailable()
            {
                if (!CrossGeolocator.IsSupported)
                    return false;
    
                return CrossGeolocator.Current.IsGeolocationAvailable;
            }
            public async void GetPosition()
            {
                Plugin.Geolocator.Abstractions.Position position = null;
                try
                {
                    var locator = CrossGeolocator.Current;
                    locator.DesiredAccuracy = 100;
    
                    position = await locator.GetLastKnownLocationAsync();
    
                    if (position != null)
                    {
                        _position = new Position(position.Latitude, position.Longitude);
                        //got a cahched position, so let's use it.
                        return;
                    }
    
                    if (!locator.IsGeolocationAvailable || !locator.IsGeolocationEnabled)
                    {
                        //not available or enabled
                        return;
                    }
    
                    position = await locator.GetPositionAsync(TimeSpan.FromSeconds(20), null, true);
    
                }
                catch (Exception ex)
                {
                    throw ex;
                    //Display error as we have timed out or can't get location.
                }
                _position = new Position(position.Latitude, position.Longitude);
                if (position == null)
                    return;
    
            }
    
        }
    }
    

    【讨论】:

    • 我的应用挂在GetPositionAsync。你的代码解决了它。谢谢。
    【解决方案3】:

    需要注意的是

    在构造函数中调用方法。 如果存在,可以使用 lat long。 VERY IMP 有 try catch,没有 try catch 应用程序崩溃。不要在 catch 中写任何东西;不想捕获异常。

        using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    using Foundation;
    using UIKit;
    using System.Threading.Tasks;
    using Plugin.Geolocator.Abstractions;
    using Plugin.Geolocator;
    using System.Diagnostics;
    using Xamarin.Forms;
    using abcde.iOS;
    
    [assembly: Xamarin.Forms.Dependency(typeof(GPSLocation_iOS))]
    
    namespace abcde.iOS
    {
    public class GPSLocation_iOS : IGPSLocation
    {
    public Position _position;
    
        public GPSLocation_iOS()
        {
            GetPosition();
        }
    
        public Dictionary<string, string> GetGPSLocation()
        {
        Dictionary<string, string> dictPosition = new Dictionary<string, string>();
    
        dictPosition.Add("latitude", _position.Latitude.ToString());
        dictPosition.Add("longitude", _position.Longitude.ToString());
    
          return dictPosition;
        }
    
        public async void GetPosition()
        {
            try
            {
                var locator = CrossGeolocator.Current;
    
                _position = await locator.GetLastKnownLocationAsync();
    
                if (_position == null)
                {
          locator.DesiredAccuracy = 50;
          var myPosition = await locator.GetPositionAsync();
          _position = new Position(myPosition.Latitude, myPosition.Longitude);
                }
            }
            catch (Exception ex)
            {
    
            }
        }
    

    【讨论】:

      【解决方案4】:

      2018-07-10 最新版本更新,

      要支持 iOS 11 及更早版本,您可以包含所有三个键:

      • NSLocationWhenInUseUsageDescription,
      • NSLocationAlwaysAndWhenInUseUsageDescription
      • NSLocationAlwaysUsageDescription。

      我使用 Xamarin 编写应用程序,它在我的 iOS 项目中运行良好

      参考:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/map

      【讨论】:

        【解决方案5】:

        我解决了我的问题,只是在 GetPositionAsync 中添加了参数:null 和 true。

        var location = await locator.GetPositionAsync(TimeSpan.FromSeconds(20), null, true);

        然后打开 GPS

        我的问题是在 Android 4.4 上

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-10
          • 1970-01-01
          • 2016-03-13
          • 1970-01-01
          • 1970-01-01
          • 2019-06-13
          相关资源
          最近更新 更多