Windows Phone 8.1 でジオフェンシングを実装しようとしています。最初に、サンプル プロジェクトを作成して、それがどのように機能するかを理解したかったのですが、機能させることができませんでした。私が達成しようとしているのは、基本的には、座標を設定し、戻るボタンを押してアプリを閉じることです。電話が関心のある領域にあるときにトースト通知をトリガーします。
空の Windows Phone (silverlight) 8.1 プロジェクト (geofence_test_01) を作成し、Windows RT コンポーネント プロジェクト (BackgroundTask) を同じソリューションに追加しました。geofence_test_01 プロジェクトに BackgroundTask の参照を追加しました。

アプリ マニフェストで ID_CAP_LOCATION が有効になっている。

MainPage.xaml には、ジオフェンシングを開始するためのボタンが 1 つしかありません。
<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)
トースト通知 & ジオフェンス 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 のおかげで、Lifecycle イベントを確認したところ、registerBackgroundTask() が実行された後でも「バックグラウンド タスクがありません」と表示されます。
