题 GetGeopositionAsync不会返回


在我的Windows Phone 8应用程序中,我尝试在主页面上使用GetGeopositionAsync来显示基于用户位置的一些项目。

调用GetGeopositionAsync不会在指定的超时内返回,它根本不返回。

我使用的代码很简单:

            Geolocator geolocator = new Geolocator();
            geolocator.DesiredAccuracyInMeters = 50;

            Geoposition geoposition = null;
            try
            {
                geoposition = await geolocator.GetGeopositionAsync(
                    maximumAge: TimeSpan.FromMinutes(5),
                    timeout: TimeSpan.FromSeconds(10));
            }
            catch (UnauthorizedAccessException ex)
           {

                // location services disabled or other error
                // user should setup his location

            }

我能找到的解决方案是为GeoCoordinateWatcher创建一个异步包装器,它似乎工作正常。 但我对我的解决方案不太自信,我更愿意使用GetGeopositionAsync,它看起来像是在WP8中获取设备位置的推荐方式。

更新:其他人报告相同的行为: http://social.msdn.microsoft.com/forums/en-us/wpdevelop/thread/ff166fac-b423-4428-abd8-610bf0102fc0


15
2018-02-26 03:00


起源


名为“IsBusy”的变量始终是创建死锁的好方法。我们看不到你在哪里使用它。 - Hans Passant
请忽略它。我在await和catch子句之后放置了断点,但都没有达到 - Andrei N.
你打电话吗? Wait 要么 Result 进一步提升你的通话栈? - Stephen Cleary


答案:


您何时调用方法来请求地理位置?当我在ViewModel中调用构造函数的一部分时,我发现遇到了同样的问题。

通过添加OnLoadedCommand并从那里调用方法,我能够在代码中解决问题。从那以后我没有进一步的问题了。


5
2018-05-14 17:07



这正是我提出的解决方案,它完全解决了我的问题。 - Senkwe
从page.Loaded事件调用也为我解决了问题。在我以前调用VM构造函数之前。 - Alex


这很奇怪,但GetGeoPositionAsync仅在使用MovementThreshold和/或ReportInterval初始化Geolocator时返回当前位置。

Geolocator geolocator = new Geolocator();
geolocator.DesiredAccuracyInMeters = 50;
geolocator.MovementThreshold = 5;
geolocator.ReportInterval = 500;

Geoposition geoposition = null;
try
{
    geoposition = await geolocator.GetGeopositionAsync(
        maximumAge: TimeSpan.FromMinutes(5),
        timeout: TimeSpan.FromSeconds(10));
}
catch (UnauthorizedAccessException ex)
{
    // location services disabled or other error
    // user should setup his location
}

4
2018-05-14 06:25



这是解决方案!! - ssilva
为了得到它,我只设置了这两个geolocator.DesiredAccuracyInMeters = 2; geolocator.MovementThreshold = 3;谢谢你的提示! - Tim


我在设备上测试时遇到了这个问题。我不得不在设备上禁用WiFi以使其工作。我知道有些人在模拟器上遇到了相反的问题。我没有做任何包装。希望能帮助到你


2
2018-06-02 00:07





我发现了一件事。如果我将精度设置为更大的精度,那么geolocator会启动返回坐标。所以它不能工作50米,但工作500,所以尝试使用下面的行代替。

        geolocator.DesiredAccuracyInMeters = 500;

1
2018-02-10 10:27





我上面有一些相同的问题。当我连接到geolocator.StatusChanged事件时,我注意到事件序列是:

  1. StatusChanged - >初始化
  2. 我在等待电话
  3. StatusChanged - >准备好了

所以我在等待呼叫之前添加了一个循环:

  while (geolocator.LocationStatus == PositionStatus.Initializing)
  {
      System.Threading.Thread.Sleep(100);
  }

这是不优雅的,但确实有效。


0
2018-06-11 02:25





这种奇怪的行为发生时的状态 geolocator 在... NotInitialized 呼叫时的状态 GetGeopositionAsync()

geolocator 只是 Ready 在两个案例中。一,当它订阅了 PositionChanged 事件。二,当一个 GetGeopositionAsync() 被称为。

所以,你只需要订阅 geolocator 到了 positionChanged 调用之前的事件 GetGeopositionAsync()

希望这可以帮助。


0
2017-11-06 17:24





我发现如果你在本地创建Geolocator,任务最终会被取消。它在我创建永久Geolocator实例时有效。


0
2017-07-27 02:30





看我的样本: http://code.msdn.microsoft.com/windowsapps/How-to-use-Cimbalino-3888977e

它使用MVVM和Cimbalino工具包!

在我的情况下,我设置ReportInterval = 5来解决这个问题。


0
2017-08-10 13:23





好吧,看起来每个人都被砍掉了直到它起作用......这对我有用:

/// <summary>
/// HACK: For some reason Geolocator.GetGeopositionAsync hangs indefinitely.
/// The workaround is to add a PositionChanged handler.
/// </summary>
private Geoposition GetGeoposition()
{
    var geolocator = new Geolocator();
    var semaphoreHeldUntilPositionReady = new SemaphoreSlim(initialCount: 0);
    Geoposition position = null;

    geolocator.ReportInterval = 1000;
    geolocator.PositionChanged += (sender, args) =>
    {
        position = args.Position;
        semaphoreHeldUntilPositionReady.Release();
    };

    semaphoreHeldUntilPositionReady.Wait();
    return position;
}

0
2017-12-07 02:45





我知道这有点老了,但我希望其他人在搜索这个主题时觉得这个答案很有帮助。

在尝试访问位置服务之前,请务必征得用户的同意。

我遇到了这个问题但通过在打开页面时调用OnNavigatedTo事件来获得他们的同意来修复它。

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
    if (IsolatedStorageSettings.ApplicationSettings.Contains("LocationConsent"))
    {
        // User has opted in or out of Location
        return;
    }
    else
    {
        MessageBoxResult result = 
            MessageBox.Show("This app accesses your phone's location. Is that ok?", 
            "Location",
            MessageBoxButton.OKCancel);

        if (result == MessageBoxResult.OK)
        {
            IsolatedStorageSettings.ApplicationSettings["LocationConsent"] = true;
        }else
        {
            IsolatedStorageSettings.ApplicationSettings["LocationConsent"] = false;
        }

        IsolatedStorageSettings.ApplicationSettings.Save();
    }
}

-3
2017-12-20 14:01



请注意,因为您的回答与OP没有任何关系。您的应用将无法通过认证,但同意与地理位置/地理位置的工作无关。 - Johnie Karr