CodeZine(コードジン)

特集ページ一覧

センサーに対応したWindowsストアアプリを作成する(後編)

速習 Windowsストアアプリケーション 第13回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2014/08/18 14:00
目次

位置情報

 位置情報は端末の位置を取得します。端末の位置を取得するには、これまでのセンサーとは異なり、マニフェストファイルに「アプリケーションが位置情報を利用すること」を指定する必要があります。

 マニフェストに指定された情報(今回の場合は「アプリケーションが位置情報を取得すること」)は、ユーザーがアプリケーションをストアからインストールする際に表示されます。

マニフェストに記載する

 マニフェストはPackage.appxmanifestファイルに記載します。

Package.appxmanifestファイル
Package.appxmanifestファイル

 Package.appxmanifestの「機能」タブの左側にある機能の一覧から「場所」にチェックを入れます。

「場所」にチェックを入れる
「場所」にチェックを入れる

 Package.appxmanifestにチェックがない場合、後述するPositionChangedイベントが発生せず、位置情報は取得できません。

位置情報を取得する

 (サンプルファイル:「GeolocatorSample.zip」)

 これから位置情報を取得するサンプルを紹介しますが、その前に、位置情報をアプリが利用する場合、アプリケーションの起動時に以下の画像のように、ユーザーに「アプリケーションが位置情報を利用することへの許可」を求めるポップアップが表示されることを知っておきましょう。

位置情報の利用にはユーザーの許可が必要
位置情報の利用にはユーザーの許可が必要

 ポップアップで「許可」をユーザーが選ぶことで、アプリケーションは初めて位置情報が利用可能になります。

 ユーザーがアプリケーションによる位置情報利用を許可した場合、以下のコードで位置情報が利用可能になります。

Geolocatorの準備
// 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端末では、センサーが必ずしも使えるとは限らないのでセンサーの有無を確認するようにしましょう。



  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:速習 Windowsストアアプリケーション

もっと読む

著者プロフィール

  • 西村 誠(ニシムラ マコト)

     Microsoft MVP Windows Platform Development。  Flash、PHPの開発経験もあり国産ECサイト構築フレームワーク「EC-CUBE」の公式エバンジェリストでもある。  ブログ:眠るシーラカンスと水底のプログラマー  著書:基礎から学ぶ Windows...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5