15

在我的 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

4

10 回答 10

5

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

我可以通过添加 OnLoadedCommand 并从那里调用方法来解决我的代码中的问题。从那以后我再也没有问题了。

于 2013-05-14T17:07:33.307 回答
4

这很奇怪,但 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
}
于 2013-05-14T06:25:08.897 回答
2

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

于 2013-06-02T00:07:32.830 回答
1

我发现了一件事。如果我将精度设置为更大,则地理定位器开始返回坐标。所以它不适用于 50 米,但适用于 500 米,因此请尝试使用下面的线。

        geolocator.DesiredAccuracyInMeters = 500;
于 2014-02-10T10:27:23.007 回答
0

我发现如果您在本地创建地理定位器,该任务最终将被取消。当我创建一个永久的 Geolocator 实例时它可以工作。

于 2014-07-27T02:30:08.750 回答
0

这种奇怪的行为发生geolocatorNotInitialized调用GetGeopositionAsync().

geolocator仅在Ready两种情况下。一,当它订阅一个PositionChanged事件时。二,当 aGetGeopositionAsync()已经被调用时。

因此,您只需geolocatorpositionChanged调用GetGeopositionAsync().

希望这可以帮助。

于 2013-11-06T17:24:47.830 回答
0

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

/// <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;
}
于 2014-12-07T02:45:30.970 回答
0

请参阅我的示例: http ://code.msdn.microsoft.com/windowsapps/How-to-use-Cimbalino-3888977e

它使用 MVVM 和 Cimbalino 工具包!

就我而言,我设置 ReportInterval = 5 来解决这个问题。

于 2014-08-10T13:23:47.670 回答
0

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

  1. StatusChanged -> 正在初始化
  2. 我的等待电话
  3. 状态已更改 -> 就绪

所以我在 await 调用之前添加了一个循环:

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

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

于 2013-06-11T02:25:21.550 回答
-3

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

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

我遇到了这个问题,但通过在打开页面时调用 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();
    }
}
于 2013-12-20T14:01:51.543 回答