【问题标题】:Windows Phone 8.1 location-trackingWindows Phone 8.1 位置跟踪
【发布时间】:2014-08-20 07:24:26
【问题描述】:

我想实现一个不断将设备位置发送到网络服务的应用程序。查看文档,我发现 Geolocation 类和一些讨论位置跟踪的文章:

实现这些文章中讨论的两个示例项目,我注意到 geolocator_PositionChanged() 事件不会在每次位置更新时触发。两次执行事件之间存在延迟(约 10/15 分钟)。奇怪的是,即使应用程序在前台执行(不仅在后台),也会发生这种情况。我正在使用 Windows Phone 模拟器。

在我的应用程序中,我有一个地图控件,我需要在其中显示用户的位置,因此,我需要为每次位置更新正确触发 geolocator_PositionChanged() 事件,没有延迟。

1) 如何使用 Geolocator 类跟踪(无延迟)设备的位置?

通过网络搜索,我发现了 GeoCoordinateWatcher 类,它提供了设备的连续位置跟踪。这是代码:

public MainPage()
{
    InitializeComponent();
    this.GetCoordinate();
}

private void GetCoordinate()
{
    var watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High)
    {
        MovementThreshold = 1
    };
    watcher.PositionChanged += this.watcher_PositionChanged;
    watcher.Start();
}

private void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
{
    //Get position data
    var pos = e.Position.Location;
    //Update mypos object
    mypos.update(pos.Latitude, pos.Longitude);
    //Update data on the main interface
    MainMap.SetView(mypos.getCoordinate(), MainMap.ZoomLevel, MapAnimationKind.Parabolic);
}

它起作用了:watcher_PositionChanged() 事件被无延迟地触发。

2) 为什么 GeoCoordinateWatcher 没有延迟? GeoCoordinateWatcher 类和 Geolocator 类有什么区别?

最后,应用程序应该将设备的位置发送到网络服务,即使它不活动。所以,我需要一个后台任务。正如 Romasz 建议的 here,我可以使用 Geolocator 类,但有一些限制。

3) 我可以在后台使用 GeoCoordinateWhatcher 吗?如果是,怎么做?

我的目标是实现一个无延迟的位置跟踪应用程序,甚至可以在后台运行。做这个的最好方式是什么?应用程序应跟踪设备的位置并不断更新网络服务(即使在后台)。我怎样才能做到这一点?最好的方法是什么?我了解 Windows Phone 应用程序的生命周期,并且我可以接受后台执行的一些限制。背景限制是多少?

【问题讨论】:

    标签: c# windows-phone-8 windows-runtime geolocation windows-phone-8.1


    【解决方案1】:

    很遗憾,Windows Phone 8.1 不支持后台连续跟踪。如果您想要此功能,则必须改为开发 Windows Phone 8 应用程序。希望他们能在 8.2、9 或接下来的任何版本中解决这个问题!

    【讨论】:

    • 感谢 Gavin 的回答。请问,能具体点吗?有一些微软文档吗?如果这在 Windows Phone 8 中是可能的,如何实现它以及为什么要从 Windows Phone 8.1 中删除此功能?
    • 当我发布这个答案时,我确实搜索了链接来备份我的陈述,但找不到任何简洁的东西。在 2014 年 4 月由 Hannes Nel 主持的 Windows Phone 8.1 Kickstart 活动中,我得到了这些信息。他确实提供了方便的幻灯片,展示了哪些 API 在哪些地方可用,哪些 API 在 Windows Phone 项目的各种 8 和 8.1 风格中不可用。我记得这个事实的原因是因为我赢得了 Lumia 820,因为我回答了一个问题,即只有使用 Windows Phone 8 API 而不是 8.1 API 才有可能。我很失望,因为这意味着我无法将我的应用升级到 8.1。
    • 这里声明:msdn.microsoft.com/en-us/library/windowsphone/develop/… > Silverlight 8.1 应用程序不支持连续后台执行
    • 我也找到了 Silverlight 8.1 的信息,但它没有涵盖 Windows Phone 8.1 的通用应用方面,所以我一直在寻找。
    • 我与 Hannes Nel 取得了联系。他告诉我他的幻灯片来自这个免费的在线课程 - microsoftvirtualacademy.com/training-courses/… - “01 | 介绍 Windows Phone 8.1 应用程序开发...”部分的幻灯片 58 指出“仅在 Silverlight 平台上可用的功能”“连续后台位置跟踪 (仅限 SL 8.0)”。澄清一下 - 您仍然可以在 WP8.1 上进行后台跟踪,您只需将您的应用程序创建为 WP8 项目即可实现此目的(不幸的是!)。
    【解决方案2】:

    有一种方法可以实现位置跟踪,但它有其局限性。对于体育应用程序来说,这还不够,但对于许多其他用例来说,它会适合。使用GeofenceBackgroundTaskLocationTrigger

    这里是一个例子:

    BackgroundAccessStatus backgroundAccessStatus = await BackgroundExecutionManager.RequestAccessAsync();
    
    Geolocator locator = new Geolocator();
    locator.DesiredAccuracyInMeters = 10;
    locator.DesiredAccuracy = PositionAccuracy.High;
    
    Geoposition currentPosition = await locator.GetGeopositionAsync(TimeSpan.FromMinutes(1),TimeSpan.FromSeconds(30));
    Geocircle fenceCircle = new Geocircle(currentPosition.Coordinate.Point.Position,25);
    Geofence newFence = new Geofence(GEOFENCE_NAME, fenceCircle, MonitoredGeofenceStates.Exited, false, TimeSpan.FromSeconds(1), DateTimeOffset.Now, TimeSpan.FromDays(30));
    GeofenceMonitor.Current.Geofences.Add(newFence);
    
    BackgroundTaskBuilder observerTaskBuilder = new BackgroundTaskBuilder();
    observerTaskBuilder.Name = OBSERVER_TASK_NAME;
    observerTaskBuilder.SetTrigger(new LocationTrigger(LocationTriggerType.Geofence));
    observerTaskBuilder.TaskEntryPoint = OBSERVER_TASK_ENTRY_POINT;
    observerTaskBuilder.Register();
    

    这将添加一个以您的位置为中心、半径为 25 米的地理围栏圈。当您退出该指定区域时,将触发后台任务。确保将地理围栏更新到新位置,当用户移动超过 25 米时,您会收到通知。

    但请记住,BackgroundTask 不必在您离开围栏边界后立即运行。它可能会延迟几分钟(我离开圈子后从未注意到延迟超过一分钟)。正如我所说:对于体育应用来说还不够,但它可能会满足您的需求。

    更多详细信息请看这里: http://msdn.microsoft.com/en-us/library/windows.devices.geolocation.geofencing.aspx

    查看示例项目: https://code.msdn.microsoft.com/windowsapps/Geofencing-and-geolocation-d7ea0ef8

    备注: 我读到强烈建议不要使用小于 50 的半径。但在我的测试中,25 效果很好,所以你最好自己检查一下。

    【讨论】:

    • @ThilinaAkalanka 上面发布了示例代码。你错过了什么?
    • 是否可以在此后台任务中将位置发送到 azure 移动服务
    • @ThilinaAkalanka 实际上,我确实将我的位置发送到带有注册后台任务的天蓝色后端。它不是移动服务,但我认为没有理由不能按预期工作。
    • 您是如何做到“使用已注册的后台任务将位置发送到 azure 后端”的。我在这里开始了一个问题 [stackoverflow.com/questions/34831107/…
    • @ThilinaAkalanka 我在那里有一个 REST/HTTP 后端并使用了 HttpClient。我从来没有使用过移动服务。您尝试使用的基于表格的方法对我来说是新的。当我找到一些时间时,我可能会找到一些答案。
    【解决方案3】:

    我所做的与@christoph 完全相同...我也刚刚添加了 Entered 事件...我的更新每 2 分钟发生一次,总是。

        Geoposition currentPosition = await locator.GetGeopositionAsync(TimeSpan.FromMinutes(1), TimeSpan.FromSeconds(30));
            Geocircle fenceCircle = new Geocircle(currentPosition.Coordinate.Point.Position, 25);
            Geofence newFence = new Geofence("CURRENT_LOC" + Guid.NewGuid(), fenceCircle, MonitoredGeofenceStates.Exited | MonitoredGeofenceStates.Entered, false, TimeSpan.FromSeconds(1), DateTimeOffset.Now, TimeSpan.FromMinutes(10));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多