我真的想知道在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;
}
}
}
}
答案 0 :(得分:0)
您的解决方案: 在您的解决方案中制作3个项目。
1>后台任务"参考App_Code"
2 - ; App_Code"包含计算,主要是后端代码"
3>地图(主项目)"参考App_Code"
将后台任务注册到项目中,并指定它应该再次运行的时间间隔
场景1> 应用开放,用户请求更新
从后面的代码中触发您的后台任务。
场景2> 应用已关闭,未使用
运行后台任务!
所以基本上保持你的backgroundTask简单(让它成为一个类,在你的run方法中你只需要调用正确的App_Code类方法),你想要在后台进行的所有计算都将它们保存在App_Code中。另外,如果我没错,那么自己触发后台任务的最小间隔不能设置在15分钟以下。
对于实时,您可以查看SignalR(此处无法提供帮助)