Windows phone 7 位置服务返回WP7上以前的坐标

Windows phone 7 位置服务返回WP7上以前的坐标,windows-phone-7,gps,location,Windows Phone 7,Gps,Location,我使用的是来自的代码,并且我一直在多个测试设备上看到相同的行为-它不是获取设备的当前位置,而是获取以前的位置(最远30英里,一小时前的位置) private void setupMaps() { watcher=新的地理坐标记录器(地理位置精度高); watcher.MovementThreshold=10.0f; watcher.StatusChanged+=新事件处理程序(watcher\u StatusChanged); watcher.PositionChanged+=新事件处理程序(w

我使用的是来自的代码,并且我一直在多个测试设备上看到相同的行为-它不是获取设备的当前位置,而是获取以前的位置(最远30英里,一小时前的位置)

private void setupMaps()
{
watcher=新的地理坐标记录器(地理位置精度高);
watcher.MovementThreshold=10.0f;
watcher.StatusChanged+=新事件处理程序(watcher\u StatusChanged);
watcher.PositionChanged+=新事件处理程序(watcher\u PositionChanged);
新线程(startOcservinBackground).Start();
}
void-ocservinbackground()
{
观察者。幽会开始(真,时间跨度。从秒(60));
}
void watcher_status已更改(对象发送器、地理位置StatusChangedEventArgs e)
{
开关(如状态)
{
案例地理位置状态。已禁用:
//位置服务已禁用或不受支持。
//检查用户是否已禁用位置服务。
if(watcher.Permission==geoppositionpermission.Denied)
{
//用户已在其设备上禁用LocServ。
showMessage(“位置是必需的,但已禁用。请在“设置”中打开它”);
}
其他的
{
showMessage(“此手机上的位置不起作用。抱歉,Crux无法运行”);
}
打破
案例地理位置状态。正在初始化:
//位置服务正在初始化。
LoadingInfo.Text=“查找位置”;
打破
案例地理位置status.NoData:
//位置服务正在工作,但无法获取位置数据
//由于信号保真度差(最有可能)
//当数据返回时,此命令间歇性触发:/
//Show(“位置数据不可用”);
打破
案例地理位置状态。准备就绪:
//位置服务正在工作并正在接收位置数据。
//statusTextBlock.Text=“位置数据可用。”;
LoadingInfo.Text=“找到位置”;
//此命令在位置改变后停止发射
打破
}
}
私有void initPostPanel()
{
PostPanel.Visibility=可见性.Visibility;
}
void watcher_位置已更改(对象发送器,地理位置更改Deventargs e)
{
//更新文本块读数。
纬度=e.Position.Location.latitude.ToString(“0.0000000000”);
经度=e.Position.Location.longitude.ToString(“0.0000000000”);
//这将触发两次,在状态被触发为就绪之前。然后不会再次调用
}
我希望发生的是,在调用StatusChanged(状态为Ready)之后,得到一系列对PositionChanged的连续调用。如果在就绪后继续调用,我希望我最终会得到正确的坐标,但在该点之后它永远不会调用

模拟器不会出现这种情况,只有在实际设备上才会出现(这使得测试非常困难,因为它实际上需要在每次测试之间驾驶!)

我也在运行教程中的源代码,它的功能大致相同


有人能告诉我更多关于这里的预期行为以及我如何获得我需要的东西吗?这只是应用程序使用时设备在当前位置的一组坐标。

看起来修复程序是阻止它使用第一个值,而不是从第二个事件中获得它:

bool gpsReady = false;
void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
{
    if (gpsReady)
    {
        latitude = e.Position.Location.Latitude.ToString("0.0000000000");
        longitude = e.Position.Location.Longitude.ToString("0.0000000000");
        locReady = true;
    }
        gpsReady = true;
    }
我不知道为什么,但当我运行附加到调试器,然后在实际使用中频繁挂起(即,事件从未触发,我的UI似乎挂起)时,上面的代码似乎工作得很好。当连接到调试器时,我从未设法重现该问题


更新:看起来这并不是一直有效。在某些情况下,它不会第二次启动,因此我的代码永远不会完成运行。如果有人能提供更多关于这方面的信息,让我更接近于简单地获得设备的实际当前位置,我肯定会将您的答案标记为答案。谢谢

我自己也有同样的问题-这有两个部分

结果是,地理坐标追踪器返回了最后一个已知的好位置——几乎总是过时的。我所做的是这样的:
检查状态是否为GeoPositionStatus.Ready,然后确保该位置的日期时间是最近的(在最近5分钟内)。然后,您可以进一步检查e.Position.Location.horizontalAccurance这比我以前的回答要好(我很确定我仍然得到过时的值,只是频率较低)-谢谢!
bool gpsReady = false;
void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
{
    if (gpsReady)
    {
        latitude = e.Position.Location.Latitude.ToString("0.0000000000");
        longitude = e.Position.Location.Longitude.ToString("0.0000000000");
        locReady = true;
    }
        gpsReady = true;
    }
case GeoPositionStatus.Ready:
    latitude = watcher.Position.Location.Latitude.ToString("0.0000000000");
    longitude = watcher.Position.Location.Longitude.ToString("0.0000000000");
    break;
<!-- language: c# -->
GeoPositionStatus = CurrentGeoDeviceStatus;
    static void geoCoordWatcher_StatusChanged(object sender, GeoPositionStatusChangedEventArgs e)
    {
        CurrentGeoDeviceStatus = e.Status;
    }
void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
{
    if (gpsReady && e.Position.Timestamp.DateTime.AddMinutes(5) > DateTime.Now)
    {
        latitude = e.Position.Location.Latitude.ToString("0.0000000000");
        longitude = e.Position.Location.Longitude.ToString("0.0000000000");
        locReady = true;
    }
}