我想更改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:Operation aborted(HRESULT异常:0x80004004(E_ABORT))
在
Windows.Devices.Geolocation.Geolocator.put_DesiredAccuracy(PositionAccuracy 价值)
我不明白这个例外,因为它没有说明理由。
如何实现这一目标(动态更改准确度和报告间隔)?
感谢。
答案 0 :(得分:2)
根据this Microsoft article,您的例外情况表明您已通过手机设置停用了位置服务:
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
}
}
答案 1 :(得分:1)
最好在更改这些属性之前使用GeoCoordinateWatcher并调用Stop()/ Start()。有a few advantages在GeoCoordinateWatcher上使用GeoLocator,但对大多数应用程序来说并不重要。由于GeoCoordinateWatcher仍然完全支持WP8,如果可行的话,你可能更容易切换到它。
答案 2 :(得分:0)
正如您在代码中所做的那样,删除StatusChanged
和PositionChanged
的所有处理程序都需要能够修改ReportInterval
等。否则将抛出此异常(0x80004004)。
就我而言,删除所有处理程序不是一种选择,因为我正在使用Geolocator
in the my WP8 app to keep my app alive in background。删除最后一个处理程序也会暂停我的应用程序,因为从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
也会导致立即回调。