我试图在Windows Phone 8.1中实现地理围栏。首先,我想创建一个示例项目,以了解它是如何工作的,但我无法使其工作。我试图实现的基本上是,我按下后退按钮设置坐标并关闭应用程序,当手机处于感兴趣的区域时,它会触发致敬通知。
我创建了一个空白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/
Geofence in the Background Windows Phone 8.1 (WinRT)
Toast notification & Geofence 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,我已经检查了生命周期事件,并且我看到了没有后台任务&#34;即使在执行了registerBackgroundTask()之后....显然在registerBackgroundTask()方法中存在错误/缺失。
答案 0 :(得分:0)
我已经尝试构建我的示例(我更容易构建一个新的示例),基于您的代码,它似乎正在工作。你可以看一下at my GitHub。
在你的情况下,有几件事情可能出错:
我知道你已经完成了一些这样的事情,但是看看我的样本,尝试运行它,也许从一开始就尝试构建自己的样本。
答案 1 :(得分:0)