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 の非同期ラッパーを作成することでした。しかし、私は自分のソリューションにあまり自信がありません。WP8 でデバイスの位置を取得する推奨方法のように見える GetGeopositionAsync を使用することをお勧めします。

更新: 他の人が同じ動作を報告しています: 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 は、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
}
于 2013-05-14T06:25:08.897 に答える
0

この奇妙な動作は、 の呼び出し中に のステータスgeolocatorが in状態のときに発生します。NotInitializedGetGeopositionAsync()

は2 つの場合geolocatorのみです。Ready1 つは、PositionChangedイベントにサブスクライブする場合です。2. aGetGeopositionAsync()がすでに呼び出されている場合。

したがって、 を呼び出す前に をイベントにgeolocatorサブスクライブするだけです。positionChangedGetGeopositionAsync()

お役に立てれば。

于 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

Geolocator をローカルで作成すると、タスクがキャンセルされてしまうことがわかりました。永続的な Geolocator インスタンスを作成したときに機能します。

于 2014-07-27T02:30:08.750 に答える
0

上記と同じ問題がいくつかありました。geolocator.StatusChanged イベントに接続すると、一連のイベントが次のようになっていることに気付きました。

  1. StatusChanged -> 初期化中
  2. 私の待機コール
  3. StatusChanged -> 準備完了

そこで、await 呼び出しの前にループを追加しました。

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

これはエレガントではありませんが、うまくいきました。

于 2013-06-11T02:25:21.550 に答える