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

Ответы

Ответ 1

Когда вы вызываете метод для запроса геопозиции? Я обнаружил, что столкнулся с той же проблемой, когда я сделал часть вызова конструктора в моей модели ViewModel.

Мне удалось исправить проблему в моем коде, добавив OnLoadedCommand и вызывая метод оттуда. С тех пор у меня не было никаких проблем.

Ответ 2

Это странно, но GetGeoPositionAsync возвращает только текущую позицию, когда Geolocator инициализируется с помощью MovementThreshold и/или ReportInterval.

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
}

Ответ 3

У меня была эта проблема при тестировании на устройстве. Мне пришлось отключить WiFi на устройстве, чтобы заставить его работать. Я знаю, что у некоторых людей была проблема с эмулятором. Мне не нужно было обертывать. Надеюсь, что это поможет

Ответ 4

Я нашел одно. Если я устанавливаю точность на более крупную, тогда геолокатор начинает возвращать координаты. Поэтому он не работает на 50 метров, но работает на 500, поэтому попробуйте использовать нижеприведенную строку.

        geolocator.DesiredAccuracyInMeters = 500;

Ответ 5

У меня были одни и те же проблемы выше. Когда я подключился к событию geolocator.StatusChanged, я заметил, что последовательность событий:

  • StatusChanged → Инициализация
  • Мой ожидающий вызов
  • StatusChanged → Ready

Итак, я добавил цикл перед моим ожидающим вызовом:

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

Это неэлегантно, но действительно работает.

Ответ 6

Это странное поведение происходит, когда статус geolocator находится в состоянии NotInitialized при вызове GetGeopositionAsync().

geolocator только Ready в двух случаях. Один, когда он подписан на событие PositionChanged. Два, когда a GetGeopositionAsync() вызывается уже.

Итак, вам просто нужно подписаться на geolocator на PositionChanged событие перед вызовом GetGeopositionAsync().

Надеюсь, что это поможет.

Ответ 7

Я обнаружил, что если вы создали локальный геолокатор, задача будет отменена. Он работает, когда я создал постоянный экземпляр Geolocator.

Ответ 9

Хорошо, похоже, что все взломали, пока это не сработало... Вот, что сработало для меня:

/// <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;
}

Ответ 10

Я знаю, что это немного старше, но я надеюсь, что другие, ищущие эту тему, найдут этот ответ полезным.

Прежде чем пытаться получить доступ к службам определения местоположения, обязательно получите согласие пользователя.

Я столкнулся с этой проблемой, но исправил ее, вызвав событие 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 location. Is that ok?", 
            "Location",
            MessageBoxButton.OKCancel);

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

        IsolatedStorageSettings.ApplicationSettings.Save();
    }
}