gpt4 book ai didi

location - 地理围栏未在 Windows Phone 8.1 的后台触发

转载 作者:行者123 更新时间:2023-12-01 06:26:42 25 4
gpt4 key购买 nike

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

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

Solution Explorer

ID_CAP_LOCATION 在应用 list 中启用。

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 中设置了一个断点,但我还没有看到那部分代码被调用。它永远不会到达断点。我使用模拟器的附加工具在“位置”选项卡中通过单击 map 上我的地理围栏区域中的某个位置来测试它,等待一段时间,但它从未遇到断点。希望有人能告诉我我在这里缺少什么......

我已经检查了以下链接来构建这个应用程序:

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,我检查了生命周期事件,即使在执行 registerBackgroundTask() 之后,我也看到“没有后台任务”......显然 registerBackgroundTask() 方法有问题/缺失。

最佳答案

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

在您的情况下,有几件事可能出错:

  • 记得在 WMAppManifest 文件中添加功能(IS_CAP_LOCATION) Package.appxmanifest(位置)
  • 检查 BackgroundTask 中的名称(命名空间、类等)
  • 检查您的 BackgroundTask 项目是否是 Windows 运行时组件并作为引用添加到您的主项目

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

    关于location - 地理围栏未在 Windows Phone 8.1 的后台触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27703168/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com