1

PositionChangedイベントハンドラーのDesiredAccuracyとReportIntervalを変更して、さまざまな場所で位置の更新頻度を動的に変更できるようにします。

私はこのようなことをしました、

void geolocator_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
{
    geolocator.StatusChanged -= geolocator_StatusChanged;
    geolocator.PositionChanged -= geolocator_PositionChanged;
    geolocator.DesiredAccuracy = PositionAccuracy.High;
    geolocator.ReportInterval = 5 * 1000;
    geolocator.StatusChanged += geolocator_StatusChanged;
    geolocator.PositionChanged += geolocator_PositionChanged;
}

しかし、問題は私が得たことです

$ exception {System.Exception:操作が中止されました(HRESULTからの例外:0x80004004(E_ABORT))

Windows.Devices.Geolocation.Geolocator.put_DesiredAccuracy(PositionAccuracy value)

理由が記載されていないため、この例外を理解していません。

どうすればこれを達成できますか(精度とレポート間隔を動的に変更するため)?

ありがとう。

4

3 に答える 3

2

このMicrosoftの記事によると、例外は、電話の設定から位置情報サービスを無効にしたことを示しています。

catch (Exception ex)
{
    if ((uint)ex.HResult == 0x80004004)
    {
        // the application does not have the right capability or the location master switch is off
        StatusTextBlock.Text = "location  is disabled in phone settings.";
    }
    //else
    {
        // something else happened acquring the location
    }
}
于 2013-03-25T13:03:37.600 に答える
1

これらのプロパティを変更する前に、GeoCoordinateWatcherの使用に移行し、Stop()/ Start()を呼び出すのが最適な場合があります。GeoCoordinateWatcherよりもGeoLocatorを使用することにはいくつかの利点がありますが、ほとんどのアプリにとって重要なことは何もありません。GeoCoordinateWatcherはまだWP8で完全にサポートされているため、可能であれば、GeoCoordinateWatcherに切り替える方が簡単な場合があります。

于 2012-12-06T01:45:54.190 に答える
0

すでにコードで行ったように、のすべてのハンドラーを削除し、変更できるようにする必要がありますStatusChanged。そうしないと、この例外(0x80004004)がスローされます。PositionChangedReportInterval

私の場合、Geolocator WP8アプリでアプリをバックグラウンドで存続させるためにを使用しているため、すべてのハンドラーを削除することはできませんでした。最後のハンドラーを削除すると、アプリが一時停止されます。これは、WPの観点からは、アプリをバックグラウンドで存続させる理由がないためです。

一時的なものを作成することで、この問題を克服できることがわかりましたGeolocator

// Wire up a temporary Geolocator to prevent the app from closing
var tempGeolocator = new Geolocator
{
    MovementThreshold = 1,
    ReportInterval = 1
};
TypedEventHandler<Geolocator, PositionChangedEventArgs> dummyHandler = (sender, positionChangesEventArgs2) => { };
tempGeolocator.PositionChanged += dummyHandler;

Geolocator.PositionChanged -= OnGeolocatorOnPositionChanged;
Geolocator.ReportInterval = reportInterval;
Geolocator.PositionChanged += OnGeolocatorOnPositionChanged;

tempGeolocator.PositionChanged -= dummyHandler;

このようにして、アプリがWPによって強制終了されることはありません。を再バインドするPositionChangedと、すぐにコールバックが発生することに注意してください。

于 2014-10-19T14:34:50.617 に答える