みなさん、こんにちは!
前の記事で 、 Lumia SensorCore SDKとそのコンポーネントを確認しました。これにより、最小電力モードでユーザーアクティビティを追跡するアプリケーションを作成できます。
この記事では、 SensorCore SDKの 実際の使用法を見て、デバイスの場所に応じて通知を送信するアプリケーションを作成します。 新しいSDKを使用するための推奨事項について説明し、ダミーデータとAPIシミュレーターの生成および使用方法を確認します。
SensorCore SDKの使用例として、 デバイスの場所に応じて通知を送信するアプリケーションを考えてみましょう。 Place Monitor APIツールは、この目的に最適です。
前の記事で説明したように、SensoreCore SDKでアプリケーションを使用するには、デバイスに特定のソフトウェアおよびハードウェアの特性が必要です。 この条件は、そのようなアプリケーションに追加の要件を課します。 たとえば、電話が関連する要件を満たしていないが、アプリケーションがインストールされている状況を処理するシナリオを開発する必要があります。
別の状況では、必要な情報の収集がユーザーによって無効になっている場合、設定に接続するための迅速なアクセスを提供する必要があり(図1-2)、ユーザーがそれらの接続を拒否するシナリオ(図3)-たとえば、アプリケーションが正しく停止する:
次に、 SensorCore SDKを使用して開発のベストプラクティスを使用してアプリケーションを作成する例を考えます 。
アプリケーションを作成する
SensorCoreを使用して、アプリケーションがインストールされるデバイスとアプリケーションの安定性および互換性を確保するための一般的なガイドラインがいくつかあります。
初期化、エラー処理、およびアプリケーションライフサイクル管理の例を以下に示します。
- Visual Studio 2013(Update 3)を使用して、C#で空のアプリ(Windows Phone)プロジェクトを作成します。
- SensorCore SDKをプロジェクトに接続します: ツール-> NuGetパッケージマネージャー-> NuGetパッケージの管理
すべてのコンポーネントの[ インストール]をクリックします 。
したがって、 Lumiaライブラリへのリンクがプロジェクトに追加されました。 センス 、 ルミア。 センス。 Windows Phone 用の テストとMicrosoft Visual C ++ 2013 ランタイム パッケージ 。
- APIにアクセスするには、SensorCore HIDデバイスとアプリケーションマニフェストでそれにアクセスする機能を宣言する必要があります。
SDKをインストールすると、次の機能がPackage.appxmanifestに自動的に追加されます。
<DeviceCapability Name="location" /> <m2:DeviceCapability Name="humaninterfacedevice"> <m2:Device Id="vidpid:0421 0716"> <m2:Function Type="usage:ffaa 0001" /> <m2:Function Type="usage:ffee 0001" /> <m2:Function Type="usage:ffee 0002" /> <m2:Function Type="usage:ffee 0003" /> <m2:Function Type="usage:ffee 0004" /> </m2:Device> </m2:DeviceCapability>
- SDKが正しく機能するには、Configuration Managerでプラットフォームをx86に切り替える必要があります。Build-> Configuration manager
デバイスでアプリケーションをテストするときは、 アクティブ ソリューション プラットフォームをARMに設定する必要があることに注意してください。
- SensoreCore SDKツールを使用するには、次のライブラリを接続します。
using Windows.UI.Popups; using System.Threading.Tasks; using Lumia.Sense; using Lumia.Sense.Testing;
SensoreCoreの初期化
アプリケーションを開発するときに、実際のSensorCore APIを使用することは常に可能または便利というわけではありません:定義済みのデータを使用して特定のアプリケーションロジックまたはユーザーインターフェイスをテストできます。または、Windows Phoneエミュレーターでアプリケーションを実行すると、実際のSensorCoreインターフェイスはまったく使用できません。 このような場合、 SensorCoreシミュレーターを使用する必要があります 。
実際のSensorCore APIをシミュレータに置き換えるのは簡単で、クラス識別子「Simulator」に追加するだけです。
private PlaceMonitor _placeMonitor;=> private PlaceMonitorSimulator _placeMonitor;
ただし、実際のクラスとシミュレータクラスを簡単に切り替えるには、クラスのエイリアスを使用し、プロジェクト内でキーワードMonitorを使用してアクセスすると便利です。
例:
//using Monitor = Lumia.Sense.PlaceMonitor; using Monitor = Lumia.Sense.Testing.PlaceMonitorSimulator;
必要な機器サポートの初期化
Lumia SensorCore SDKの動作は、すべてのデバイスが所有するわけではない電話機のハードウェア機能に基づいているため、開発時に最初に考慮すべきことは、デバイスがSensorCoreに必要な機器をサポートするかどうかを確認することです。
SensorCore SDKを使用する必要のないアプリケーションのシナリオがある場合は、それに応じてUIコントロールの可視性を調整するとよいでしょう。
if (await Monitor.IsSupportedAsync())
PlaceMonitorSimulatorクラスが使用されている間、このプロパティはサポートされていないことに注意してください。この段階で、 対応するコードをコメント化する必要がありますが、アプリケーションで実際のAPIを使用する場合は、再度アクティブ化する必要があります:
//if (await Monitor.IsSupportedAsync()) { // Init SensorCore if (await CallSensorcoreApiAsync(async () => { monitor = await Monitor.GetDefaultAsync(); })) { Debug.WriteLine("PlaceMonitor initialized."); // Update list of known places UpdateKnownPlacesAsync(); HomeButton.IsEnabled = true; WorkButton.IsEnabled = true; FrequentButton.IsEnabled = true; CurrentButton.IsEnabled = true; } else { Application.Current.Exit(); } // Focus on home OnHomeClicked(null, null); } /* else { MessageDialog dialog; dialog = new MessageDialog("Your device doesn't support Motion Data. Some functionality will be disabled", "Information"); dialog.Commands.Add(new UICommand("Ok")); await dialog.ShowAsync(); HomeButton.IsEnabled = false; WorkButton.IsEnabled = false; FrequentButton.IsEnabled = false; }*/
セキュアコールLumia SensorCore SDK
APIを呼び出すとき、必要な設定( ロケーションデータ/モーションデータ )が有効になっており、例外が発生しないことを確認することが重要です。
これを行うには、SensorCore SDKを呼び出すときに定義する必要があり、そのような状況を処理するラッパーを使用します 。
private async Task<bool> CallSensorcoreApiAsync(Func<Task> action) { Exception failure = null; try { await action(); } catch (Exception e) { failure = e; } if (failure != null) { switch (SenseHelper.GetSenseError(failure.HResult)) { case SenseError.LocationDisabled: MessageDialog dialog = new MessageDialog("Location has been disabled. Do you want to open Location settings now?", "Information"); dialog.Commands.Add(new UICommand("Yes", async cmd => await SenseHelper.LaunchLocationSettingsAsync())); dialog.Commands.Add(new UICommand("No")); await dialog.ShowAsync(); new System.Threading.ManualResetEvent(false).WaitOne(500); return false; case SenseError.SenseDisabled: dialog = new MessageDialog("Motion data has been disabled. Do you want to open Motion data settings now?", "Information"); dialog.Commands.Add(new UICommand("Yes", async cmd => await SenseHelper.LaunchSenseSettingsAsync())); dialog.Commands.Add(new UICommand("No")); await dialog.ShowAsync(); new System.Threading.ManualResetEvent(false).WaitOne(500); return false; default: dialog = new MessageDialog("Failure: " + SenseHelper.GetSenseError(failure.HResult), ""); await dialog.ShowAsync(); return false; } } return true; }
これで、SensorCore SDKにアクセスするためのmonitor.CallSensorcoreApiAsyncラッパーの準備ができたので、SDK呼び出しが安全になります。
API SensorCore SDKを使用する前に、 GetDefaultAsyncを呼び出して初期化する必要があります。 上記のシェルを使用して初期化を実行できます。
if (await CallSensorcoreApiAsync(async () => { monitor = await Monitor.GetDefaultAsync(); }))
SensorCore APIへの呼び出しが失敗した場合、アプリケーションはこの時点で停止します。
センサーの有効化と無効化
Windows XAMLアプリケーションでは、管理モデルは Silverlightアプリケーションとは異なるため、センサーの接続と切断は異なる方法で処理されます。
VisibilityChangedイベントハンドラーを追加します。ここでは、アプリケーションがバックグラウンドに送信されたとき、または再びフォーカスが合ったときにPlaceMonitorをアクティブ化および非アクティブ化します。
Windows XAML:
Window.Current.VisibilityChanged += async (oo, ee) => { if (monitor != null) { if (!ee.Visible) { await CallSensorcoreApiAsync(async () => { await monitor.DeactivateAsync(); }); } else { await CallSensorcoreApiAsync(async () => { await monitor.ActivateAsync(); }); } } };
Silverlight アプリケーションの場合 、以下を実行します。
protected async override void OnNavigatedTo(NavigationEventArgs e) { if (monitor == null) { await Initialize(); } await monitor.ActivateAsync(); } protected override async void OnNavigatingFrom(NavigatingCancelEventArgs e) { await monitor.DeactivateAsync(); }
エラー処理
Lumia SensorCore SDKのすべてのエラーにより例外が発生し、 SenseHelper.GetSenseError()関数を使用して詳細情報を取得できます。
前述のように、SensorCore SDKを使用するアプリケーションは、SDK機能をサポートしていないデバイスにもインストールできます。
このようなアプリケーションでは、データ取得センサーがどれも使用できない場合のシナリオを説明する必要があります 。 SensorCore SDKなしではアプリケーションが機能しない場合、この機能はWindows Phoneストアの アプリケーションの説明で指定する必要があります。
テストデータ
デフォルトでは、各ダミーAPIには処理および再生用のデータがあり、記録されたデータを入力として受け入れることもできます。
独自のセンサーデータをモデル化するには、SenseRecorderクラスを使用できます。
PlaceMonitor monitor = await PlaceMonitor.GetDefaultAsync(); SenseRecorder recorder = new SenseRecorder(monitor); await recorder.StartAsync(); // ... ... await recorder.StopAsync(); await recorder.GetRecording().SaveAsync();
SenseRecording.SaveAsync()は、記録されたデータを表示するためにドキュメントの表示を開始し、電話のドキュメントフォルダーに保存することを提案します。 Explorerを使用して電話機をコンピューターに接続することにより、このフォルダーから保存済みファイルを取得できます。
次に、レコードをプロジェクトに関連付け、 SenseRecording.LoadFromFileAsync()関数を使用してロードし、GetDefaultAsync()関数を使用してデータをシミュレータに転送します。
SenseRecording recording = await SenseRecording.LoadFromFileAsync("myData.txt"); PlaceMonitorSimulator simulator = await PlaceMonitorSimulator.GetDefaultAsync(recording);
デフォルトでは、最初のイベントトリガーが起動直後に記録されるように記録が設定されます。 これらのレコードを以前または後で修正済みとして定義する必要がある場合、 GetDefaultAsync()関数に対して、シミュレーターが動作を開始するための独自の時間を設定できます。
PlaceMonitorSimulator simulator = await PlaceMonitorSimulator.GetDefaultAsync(recording, DateTime.Now - TimeSpan.FromDays(2));
シミュレータは記録されたデータを無期限に再現するため、記録は2日間の履歴として、またはその逆に、アプリケーションの開始から2日後にのみ受信されるデータとして使用できます。
SenseRecordingクラスはバックグラウンドで機能しないため、アプリケーションがバックグラウンドに切り替わると、テストデータの記録が停止し、アクティブ化された場合にのみ続行できることに注意してください。
バックグラウンドタスク
このアプリケーションのアイデアを実装する場合、バックグラウンドタスクを使用する必要があります。これは、頻繁に訪れた場所のジオフェンスに入った後、アプリケーションが実行されていないときに、 「ユーザーが帰宅した」というアプリケーションからの通知が発生するためです。
このようなタスクを作成するには、標準のアルゴリズムがあります。
- バックグラウンドタスクの作成。
- アプリケーションマニフェストで宣言します。
- アプリケーションでのバックグラウンドタスクの登録。
その実装に移りましょう:
新しいWindows ランタイム コンポーネントプロジェクトをソリューションに追加します。
自動的に生成されたClass1.csの名前をGeofenceBackgroundTaskに変更し、IBackgroundTaskインターフェイスを継承します。
適切な名前空間を接続することを忘れないでください: Windows.ApplicationModel.Backgroundを使用して
バックグラウンドタスクに必要なRunメソッドをこのクラスに追加します。
public void Run(IBackgroundTaskInstance taskInstance) { // var toastTemplate = ToastTemplateType.ToastText02; var toastXML = ToastNotificationManager.GetTemplateContent(toastTemplate); var textElements = toastXML.GetElementsByTagName("text"); textElements[0].AppendChild(toastXML.CreateTextNode("Welcome again!")); var toast = new ToastNotification(toastXML); ToastNotificationManager.CreateToastNotifier().Show(toast); }
バックグラウンドタスクプロジェクトへのリンクを追加します 。 右 クリック ->参照->参照の追加
[OK]を選択してクリックします。
Package.appxmanifestでバックグラウンドタスクを宣言します。
宣言->利用可能な宣言:バックグラウンドタスク->追加タブ
Properties:Locationをマークし、 BackgroundTask.GeofenceBackgroundTaskという名前空間を持つクラスの名前をエントリポイントフィールドに入力します。
次のメソッドを追加して、バックグラウンドタスクを登録します。
public static async Task RegisterBackgroundTask() { try { var backgroundAccessStatus = await BackgroundExecutionManager.RequestAccessAsync(); var geofenceTaskBuilder = new BackgroundTaskBuilder() { Name = "GeofenceBackgroundTask", TaskEntryPoint = "BackgroundTask.GeofenceBackgroundTask" }; var trigger = new LocationTrigger(LocationTriggerType.Geofence); geofenceTaskBuilder.SetTrigger(trigger); geofenceTaskBuilder.Register(); } catch (Exception e) { Debug.WriteLine(e); } }
タスクを登録します。これのために、アプリケーションで前のメソッドを呼び出します。
await RegisterBackgroundTask();
その結果、頻繁に訪れる場所のジオゾーンに入ると、バックグラウンドでアプリケーションから通知を受け取ります。
おわりに
開発者は、Windows Phone 8.1の既存の機能に加えて、Lumia SensorCore SDKを使用して、ユーザーが最小限の電話のエネルギーリソースを消費しながら生活活動に関する情報を受信および分析できるアプリケーションを作成するための高度な機能を取得します。
開発者は、Windows Phoneストアからダウンロードできる実際のアプリケーションの既存の例から新しいAPIを使用する経験を適用できます。 また、新しいSDKの詳細なドキュメントを使用します。
便利なリンク
Lumia SensorCore SDK:
Microsoft Virtual Academy(MVA)トレーニングコース
Windows開発センター
無料または試用版のVisual Studio 2013をダウンロードする
Lumia SensorCore SDK:パート1.概要