CrossGeolocator 的 GetPositionAsync 不起作用

Posted

技术标签:

【中文标题】CrossGeolocator 的 GetPositionAsync 不起作用【英文标题】:CrossGeolocator's GetPositionAsync does not work 【发布时间】: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 方法并且效果很好。

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

【问题讨论】:

【参考方案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 上

【讨论】:

以上是关于CrossGeolocator 的 GetPositionAsync 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

CrossGeolocator GetPositionAsync 退出循环/方法

Xamarin-靠近位置

vue中实现百度地图拖拽地图定位功能

Xamarin 表单获取当前位置需要更多时间

xamarin 形式的地理定位器

关于光的反射和折射的例子?