雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

わんくま東京勉強会 #64 アフターフォロー (23) : 位置情報 (Location)

Windows Phone では GPS を利用して位置情報を取得する事が出来ます。
GPS はハードウェア要件によると必須機能となっているため、全ての端末で利用可能です。
Location の利用方法は昨日紹介したセンサーに近いです。
センサーと同じ様に、同期的な方法とイベント方式があります。

同期実行

// using System.Device;

using (var location = new GeoGeoCoordinateWatcher(GeoPosiitonAccuracy.Default))
{
  location.Start(); // Start メソッドで位置情報チェック開始
  var position = location.Position; // Position プロパティで情報を取得
  var latitude = position.Location.Latitude; // 緯度
  var longitude = position.Location.Longitude; // 経度
  location.Stop(); // チェック終了
}

GPS は情報を取得するのに結構時間がかかります。
従って、上記プログラムだと Position プロパティへのアクセス時に数秒に渡ってスレッドをロックする事になるでしょう。
……って事で、実際には以下のイベント方式を使う様にしてください。

イベント形式

例によって location 変数をクラスのメンバ変数にしておいてコンストラクタ辺りで初期化をします。

location = new GeoGeoCoordinateWatcher(GeoPosiitonAccuracy.Default);
location.PositionChanged += new EventHandler<GeoPositionStatusChangedEventArgs>(Location_StatusChanged);
                           // PositionChanged イベントにイベントハンドラを登録

イベントハンドラ側はこちら。

  // UI スレッドじゃないので Dispatcher.BeginInvoke が必要です
private void Location_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
  Deployment.Current.Dispatcher.BeginInvoke(
      () => {
                var position = e.Position; // 情報は EventArgs の Position プロパティから取得出来ます
                // 後は一緒
                var latitude = position.Location.Latitude; // 緯度
                var longitude = position.Location.Longitude; // 経度
            });

後は、チェックを開始するタイミングで location.Start() を呼び出せば OK です。
Location も結構バッテリを喰うので必要最低限の間隔で行う様にしましょう。
ちなみに、チェックの停止は Stop メソッドで行えます。
※ Location も IDisposable なクラスなので、オブジェクト破棄のタイミングで Dispose メソッドを呼ぶのもお忘れなく。
なお、アプリケーションで GPS から位置情報を取得する場合は、必ずユーザーに同意を求める様にしてください。
※この確認は、アプリケーション内で初回に情報を取得する際のみで OK です。