1

我想改变PositionChanged Event Handler中的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 值)

我不理解这个例外,因为它没有说明原因。

我怎样才能实现这一点(动态更改准确性和报告间隔)?

谢谢。

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有一些优势,但对于大多数应用程序来说并不重要。由于 WP8 仍完全支持 GeoCoordinateWatcher,如果可行,您可能更容易切换到它。

于 2012-12-06T01:45:54.190 回答
0

正如您在代码中所做的那样,删除所有处理程序StatusChangedPositionChanged需要能够修改ReportInterval等。否则将引发此异常(0x80004004)。

就我而言,删除所有处理程序不是一个选项,因为我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 回答