前回の「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.