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 不起作用的主要内容,如果未能解决你的问题,请参考以下文章