GetGeopositionAsync不会返回

时间:2013-02-26 03:00:33

标签: windows-phone-8

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

10 个答案:

答案 0 :(得分:5)

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

我能够通过添加OnLoadedCommand并从那里调用方法来修复代码中的问题。从那以后我就没有其他问题了。

答案 1 :(得分: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
}

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

        geolocator.DesiredAccuracyInMeters = 500;

答案 4 :(得分:0)

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

  1. StatusChanged - >正在初始化
  2. 我的等待电话
  3. StatusChanged - >就绪
  4. 所以我在等待电话之前添加了一个循环:

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

    这不太优雅,但确实有效。

答案 5 :(得分:0)

当调用geolocatorNotInitialized的状态为GetGeopositionAsync()状态时,会发生这种奇怪的行为。

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

因此,您只需在调用geolocator之前订阅positionChangedGetGeopositionAsync()个事件。

希望这有帮助。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

它使用MVVM& Cimbalino工具包!

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

答案 8 :(得分: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;
}

答案 9 :(得分:-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();
    }
}