实时GPS UWP

时间:2016-03-24 09:37:06

标签: background geolocation win-universal-app

我真的想知道在UWP应用程序在bakground中运行时如何更新地图中用户的位置

这是我现在的代码

 private async void PinPoints()
    {

        //Pin point to the map
        Windows.Devices.Geolocation.Geopoint position = await Library.Position();
        double lat = position.Position.Latitude;
        double lon = position.Position.Longitude;
        //Geoposition alttest = await Library.Temp();
        //alt = alttest.Coordinate.Altitude;
        DependencyObject marker = Library.Marker(""
            //+ Environment.NewLine + "Altitude " + alt
            );
        Display.Children.Add(marker);
        Windows.UI.Xaml.Controls.Maps.MapControl.SetLocation(marker, position);
        Windows.UI.Xaml.Controls.Maps.MapControl.SetNormalizedAnchorPoint(marker, new Point(0.5, 0.5));
        Display.LandmarksVisible = true;
        Display.ZoomLevel = 16;
        Display.Center = position;
    }

此功能将为我精确定位当前位置,但只有当用户打开此页面时才会显示,因为我已将其放入公共地图(){}

当前:在打开地图页面时获取位置,当我走地图时仍然是同一个地方 我想要的是什么:当我继续前进并且也在后台运行时位置不断变化(如果应用程序是近距离位置数据仍在更改)

是否有任何代码可以解决此位置问题,如果我必须添加代码应该在哪里修复,我该怎么办?

附加现在我通过使用类似这样的类创建Window Runtime Component(Universal)来执行后台(不确定是否可行)

*我已将此项目作为主要项目的参考

namespace BackgroundRunning
{
public sealed class TaskBG : IBackgroundTask
{
    BackgroundTaskDeferral _deferral = null;
    Accelerometer _accelerometer = null;
    Geolocator _locator = new Geolocator();
    public void Run(IBackgroundTaskInstance taskInstance)
    {
        _deferral = taskInstance.GetDeferral();
        try
        {
            // force gps quality readings
            _locator.DesiredAccuracy = PositionAccuracy.High;

            taskInstance.Canceled += taskInstance_Canceled;

            _accelerometer = Windows.Devices.Sensors.Accelerometer.GetDefault();
            _accelerometer.ReportInterval = _accelerometer.MinimumReportInterval > 5000 ? _accelerometer.MinimumReportInterval : 5000;
            _accelerometer.ReadingChanged += accelerometer_ReadingChanged;

        }
        catch (Exception ex)
        {
            // Add your chosen analytics here
            System.Diagnostics.Debug.WriteLine(ex);
        }
    }
    void taskInstance_Canceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
    {
        _deferral.Complete();
    }
    async void accelerometer_ReadingChanged(Windows.Devices.Sensors.Accelerometer sender, Windows.Devices.Sensors.AccelerometerReadingChangedEventArgs args)
    {
        try
        {
            if (_locator.LocationStatus != PositionStatus.Disabled)
            {
                try
                {
                    Geoposition pos = await _locator.GetGeopositionAsync();
                }
                catch (Exception ex)
                {
                    if (ex.HResult != unchecked((int)0x800705b4))
                    {
                        System.Diagnostics.Debug.WriteLine(ex);
                    }
                }
            }
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine(ex);
        }
    }

    public void Dispose()
    {
        if (_accelerometer != null)
        {
            _accelerometer.ReadingChanged -= accelerometer_ReadingChanged;
            _accelerometer.ReportInterval = 0;
        }
    }

}

}

1 个答案:

答案 0 :(得分:0)

您的解决方案: 在您的解决方案中制作3个项目。

1>后台任务"参考App_Code"

2 - ; App_Code"包含计算,主要是后端代码"

3>地图(主项目)"参考App_Code"

将后台任务注册到项目中,并指定它应该再次运行的时间间隔

场景1> 应用开放,用户请求更新

从后面的代码中触发您的后台任务。

场景2> 应用已关闭,未使用

运行后台任务!

所以基本上保持你的backgroundTask简单(让它成为一个类,在你的run方法中你只需要调用正确的App_Code类方法),你想要在后台进行的所有计算都将它们保存在App_Code中。另外,如果我没错,那么自己触发后台任务的最小间隔不能设置在15分钟以下。

对于实时,您可以查看SignalR(此处无法提供帮助)