我正在尝试在 Windows phone 8.1 中实现地理围栏。首先,我想创建一个示例项目来了解它是如何工作的,但我无法让它工作。我想要实现的基本上是,我将设置坐标并通过按返回按钮关闭应用程序,当手机位于感兴趣的区域时它会触发 toast 通知。
我创建了一个空白的 Windows 手机(silverlight)8.1 项目(geofence_test_01)并将一个 Windows RT 组件项目(BackgroundTask)添加到同一个解决方案中。在 geofence_test_01 项目中添加了对 BackgroundTask 的引用。
ID_CAP_LOCATION 在应用清单中启用。
MainPage.xaml 只有一个按钮来启动地理围栏。
<Button Name="btnStart" Content="Start" Click="btnStart_Click"/>
在 btnSave_Click 中,我调用了一个创建地理围栏并注册后台任务的方法。
private void btnStart_Click(object sender, RoutedEventArgs e)
{
Init_BackgroundGeofence();
registerBackgroundTask();
}
private async Task Init_BackgroundGeofence()
{
//----------------- Crating Geofence ---------------
var geofenceMonitor = GeofenceMonitor.Current;
var geoId = "building9";
var positionBuilding9 = new BasicGeoposition()
{
Latitude = 47.6397,
Longitude = -122.1289
};
var geofence = new Geofence(geoId, new Geocircle(positionBuilding9, 100),
MonitoredGeofenceStates.Entered | MonitoredGeofenceStates.Exited,
false, TimeSpan.FromSeconds(10));
geofenceMonitor.Geofences.Add(geofence);
}
private async Task registerBackgroundTask()
{
//----------------- Register Background Task ---------------
var backgroundAccessStatus =
await BackgroundExecutionManager.RequestAccessAsync();
var geofenceTaskBuilder = new BackgroundTaskBuilder
{
Name = "GeofenceBackgroundTask",
TaskEntryPoint = "BackgroundTask.GeofenceBackgroundTask"
};
var trigger = new LocationTrigger(LocationTriggerType.Geofence);
geofenceTaskBuilder.SetTrigger(trigger);
var geofenceTask = geofenceTaskBuilder.Register();
}
最后,在 BackgroundTask 中,我有以下代码:
namespace BackgroundTask
{
public sealed class GeofenceBackGroundTask : IBackgroundTask
{
public void Run(IBackgroundTaskInstance taskInstance)
{
var geofenceMonitor = GeofenceMonitor.Current;
var geoReports = geofenceMonitor.ReadReports();
var geoId = "building9";
foreach (var geofenceStateChangeReport in geoReports)
{
var id = geofenceStateChangeReport.Geofence.Id;
var newState = geofenceStateChangeReport.NewState;
if (id == geoId && newState == GeofenceState.Entered)
{
//------ Call NotifyUser method when Entered -------
notifyUser();
}
}
}
private void notifyUser()
{
var toastTemplate = ToastTemplateType.ToastText02;
var toastXML = ToastNotificationManager.GetTemplateContent(toastTemplate);
var textElements = toastXML.GetElementsByTagName("text");
textElements[0].AppendChild(toastXML.CreateTextNode("You are in!"));
var toast = new ToastNotification(toastXML);
ToastNotificationManager.CreateToastNotifier().Show(toast);
}
}
}
在模拟器中构建和部署它时没有错误。我在 backgroundTask 中设置了一个断点,但我还没有看到那部分代码被调用。它永远不会到达断点。我通过在位置选项卡中使用模拟器的附加工具来测试它,方法是单击地图上我的地理围栏区域中的某处,等待一段时间,但它从未达到断点。希望有人能告诉我我在这里缺少什么...
我检查了以下链接以构建此应用程序:
http://www.jayway.com/2014/04/22/windows-phone-8-1-for-developers-geolocation-and-geofencing/
后台地理围栏 Windows Phone 8.1 (WinRT)
Toast 通知和地理围栏 Windows Phone 8.1
http://java.dzone.com/articles/geofencing-windows-phone-81
谢谢
您可以在此处下载该项目: https ://drive.google.com/file/d/0B8Q_biJCWl4-QndYczR0cjNhNlE/view?usp=sharing
---- 一些线索
感谢 Romasz,我检查了生命周期事件,即使在 registerBackgroundTask() 执行后我也看到“没有后台任务”......显然 registerBackgroundTask() 方法中有一些错误/缺失。