前回の「Windows PhoneをShake!加速度センサアプリを作る」では、加速度センサを利用してオブジェクトを操作したり、端末をシェイクしてイベントを実行する方法を紹介しました。今回はGPSを使って、位置情報を取得する方法を紹介します。
スマートフォンの最も便利な機能の1つに、地図を使った現在地周辺の施設検索があります。iPhoneやAndroidではGoogle Maps、Windows PhoneではBing Mapsがデフォルトで用意されています。また、TwitterやFacebookといった主要なソーシャルネットワーク/SNSでも位置情報が使われています。
もはやスマートフォンに位置情報は欠かせない機能になっています。Windows Phoneでは、そんな位置情報も簡単に取得、シミュレーションできます。
はじめに、経度緯度の値を取得しましょう。Expression BlendでWindows Phoneプロジェクトを作成し、TextBlockを2つ並べて、それぞれに「Latitude」「Longitude」と名前を付けます。
プロジェクトをVisual Studioで開き、参照設定にSystem.Device.dllを追加します。
MainPage.xaml.csを開き、usingを追加します。
using System.Device.Location;
この画面に遷移したときに位置情報を使用するように記述します。
GeoCoordinateWatcher geoWatcher = new GeoCoordinateWatcher(); protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { geoWatcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(geoWatcher_PositionChanged); geoWatcher.Start(); } void geoWatcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e) { Dispatcher.BeginInvoke(()=> Latitude.Text = e.Position.Location.Latitude.ToString() ); Dispatcher.BeginInvoke(()=> Longitude.Text = e.Position.Location.Longitude.ToString() ); } protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) { geoWatcher.Stop(); }
遷移時のイベントには、OnNavigatedToを用います。geoCoordinateWatcherをインスタンス化し、Positionが変わるごとにgeoWatcher_PositionChangedが実行されます。
geoWatcher_PositionChangedの引数「e」から値を取得できますが、センサはUIスレッドとは別のスレッドで動作しているため、Dispatcher.BeginInvokeを使ってアクセスします。
以下がコードの全文です。
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using Microsoft.Phone.Controls; using System.Device.Location; namespace GPSLocation { public partial class MainPage : PhoneApplicationPage { public MainPage() { InitializeComponent(); } GeoCoordinateWatcher geoWatcher = new GeoCoordinateWatcher(); protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { geoWatcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(geoWatcher_PositionChanged); geoWatcher.Start(); } void geoWatcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e) { Dispatcher.BeginInvoke(()=> Latitude.Text = e.Position.Location.Latitude.ToString() ); Dispatcher.BeginInvoke(()=> Longitude.Text = e.Position.Location.Longitude.ToString() ); } protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) { geoWatcher.Stop(); } } }
実機で実行してみましょう。端末に現在の経度緯度が表示されると思います。
次ページでは、位置情報をシミュレートしたり、現在地を取得して地図で確認したりします。
Copyright © ITmedia, Inc. All Rights Reserved.