4

我正在尝试在 Windows phone 8.1 中实现地理围栏。首先,我想创建一个示例项目来了解它是如何工作的,但我无法让它工作。我想要实现的基本上是,我将设置坐标并通过按返回按钮关闭应用程序,当手机位于感兴趣的区域时它会触发 toast 通知。

我创建了一个空白的 Windows 手机(silverlight)8.1 项目(geofence_test_01)并将一个 Windows RT 组件项目(BackgroundTask)添加到同一个解决方案中。在 geofence_test_01 项目中添加了对 BackgroundTask 的引用。

解决方案资源管理器

ID_CAP_LOCATION 在应用清单中启用。

WMAppManifest.xml

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() 方法中有一些错误/缺失。

4

2 回答 2

0

我已经尝试根据您的代码构建我的示例(构建一个新示例对我来说更容易),它似乎正在工作。您可以在我的 GitHub 上查看它。

在您的情况下,有几件事可能出了问题:

  • 记得在WMAppManifest文件 (IS_CAP_LOCATION) Package.appxmanifest (Location)中添加功能
  • 检查BackgroundTask中的名称(名称空间、类等)
  • 检查您的BackgroundTask项目是否为Windows Runtime Componenet并作为参考添加到您的主项目中

我知道你已经做了一些这样的事情,但是看看我的示例,尝试运行它,也许从一开始就尝试构建你自己的示例。

于 2015-01-02T12:36:16.000 回答
0

您是否使用正确支持的任务类型(即位置)在声明下的Package.appxmanifest中添加了后台任务?在此处输入图像描述

于 2016-06-21T08:49:04.477 回答