位置情報
位置情報は端末の位置を取得します。端末の位置を取得するには、これまでのセンサーとは異なり、マニフェストファイルに「アプリケーションが位置情報を利用すること」を指定する必要があります。
マニフェストに指定された情報(今回の場合は「アプリケーションが位置情報を取得すること」)は、ユーザーがアプリケーションをストアからインストールする際に表示されます。
マニフェストに記載する
マニフェストはPackage.appxmanifestファイルに記載します。
Package.appxmanifestの「機能」タブの左側にある機能の一覧から「場所」にチェックを入れます。
Package.appxmanifestにチェックがない場合、後述するPositionChangedイベントが発生せず、位置情報は取得できません。
位置情報を取得する
(サンプルファイル:「GeolocatorSample.zip」)
これから位置情報を取得するサンプルを紹介しますが、その前に、位置情報をアプリが利用する場合、アプリケーションの起動時に以下の画像のように、ユーザーに「アプリケーションが位置情報を利用することへの許可」を求めるポップアップが表示されることを知っておきましょう。
ポップアップで「許可」をユーザーが選ぶことで、アプリケーションは初めて位置情報が利用可能になります。
ユーザーがアプリケーションによる位置情報利用を許可した場合、以下のコードで位置情報が利用可能になります。
// Geolocatorの生成 this._locator = new Geolocator(); // インターバルをミリ秒で指定 this._locator.ReportInterval = 1000; // 値の変更と状態の変更を取得するイベントハンドラーをセット this._locator.PositionChanged += _locator_PositionChanged; this._locator.StatusChanged += _locator_StatusChanged;
PositionChangedとStatusChangedイベントハンドラーで値を取得します。
async void _locator_StatusChanged(Geolocator sender, StatusChangedEventArgs args) { var status = args.Status; await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { this.status.Text = status.ToString(); }); } async void _locator_PositionChanged(Geolocator sender, PositionChangedEventArgs args) { var geoInfo = await this._locator.GetGeopositionAsync(); var civic = geoInfo.CivicAddress; var coordinate = geoInfo.Coordinate; await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { if (civic != null) { this.country.Text = civic.Country; } else { this.country.Text = "null"; } this.accuracy.Text = coordinate.Accuracy.ToString(); this.altitude.Text = coordinate.Point.Position.Altitude.ToString(); this.latitude.Text = coordinate.Point.Position.Latitude.ToString(); this.longitude.Text = coordinate.Point.Position.Longitude.ToString(); this.heading.Text = coordinate.Heading.ToString(); }); }
StatusChangedイベントハンドラー
StatusChangedイベントハンドラーは状態が変更になると呼ばれます。StatusChangedEventArgsのStatusプロパティからPositionStatus列挙型で取得でき、以下の値を持ちます。
PositionStatus.ready
位置情報を取得する準備ができた状態です。
PositionStatus.initializing
位置情報センサーが初期化中の状態です。
PositionStatus.noData
まだ値を取得していない状態です。GeolocatorのLocationStatusプロパティに格納されている値です。
PositionStatus.disabled
ユーザーが許可を位置情報利用の許可を与えていない場合は、この値になります。
PositionStatus.notInitialized
位置情報センサーが未初期化の状態です。GeolocatorのLocationStatusプロパティに格納されている値です。
PositionStatus.notAvailable
センサーは該当端末では利用できません。
PositionChangedイベントハンドラー
PositionChangedイベントハンドラーは位置情報の変更を取得します。GetGeopositionAsync()メソッドから取得でき位置情報は以下のプロパティを持ちます。
CivicAddress
都市情報です(例:JP)。
Coordinate
さまざまな位置情報です。緯度(latitude)、経度(longitude)、高度(altitude)、方角(heading)などがここから取得できます。
まとめ
今回は前編・後編にわたって端末に備えられたセンサーについて紹介してきました。センサーを利用することで、モバイルデバイスならではの機能が実装できますので、ぜひ、センサーを用いた面白いアプリケーションをどんどん作成してください。
Windows Phone(スマートフォン)であればある程度のセンサーの搭載は必須の要件として保証されていますが、タブレット、ノートPC、デスクトップPCと用途がさまざまなWindows 8.1端末では、センサーが必ずしも使えるとは限らないのでセンサーの有無を確認するようにしましょう。