情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Windows Phone 8 の .NET ロケーション API を使用する方法

2014/06/18

対象: Windows Phone 8 および Windows Phone Silverlight 8.1 のみ

メモメモ:

Windows Phone 8 には、位置認識アプリを作成するための新しい Windows Phone ランタイム API が用意されています。このトピックの内容は、Windows Phone OS 7.0 で導入され、引き続き完全にサポートされている .NET Location API に適用されます。どの API セットがアプリケーションに適しているかについては、「Windows Phone 8 の位置情報」を参照してください。

このトピックでは、位置情報サービスを初期化する方法、サービスのステータスの変化を処理する方法、および位置情報データを取得する方法について説明します。 位置情報サービスを使用するサンプル アプリケーションを参照およびダウンロードするには、「位置情報サービスのサンプル」を参照してください。

このトピックは、次のセクションで構成されています。

位置情報サービスのマネージ API を使用するには、最初に System.Device.dll への参照をアプリケーションに追加する必要があります。

位置情報サービス DLL への参照を追加するには

  1. Visual Studio で新しいソリューションまたは既存の Windows Phone ソリューションを開きます。

  2. [プロジェクト] メニューの [参照の追加] を選択します。

  3. [.NET] タブで、コンポーネント名 "System.Device" を選択し、[OK] をクリックします。

次に、位置情報サービスを使用するページに対応する .xaml.cs ファイルの先頭に using ディレクティブを追加します。

using System.Device.Location;

位置情報サービスにアクセスするために使用する GeoCoordinateWatcher オブジェクトに関する変数の宣言を追加します。変数のクラス スコープを指定し、そのページが表示されている限り、変数がメモリ内に保持されるようにします。

public partial class MainPage : PhoneApplicationPage
{
  GeoCoordinateWatcher watcher;

次のコードでは、位置情報サービスからデータを取得する方法を示します。

位置情報サービスからデータを取得するには

  1. GeoCoordinateWatcher オブジェクトの Start メソッドを使用して、位置情報サービスからのデータの取得を開始します。ページが読み込まれた直後に、これを呼び出すことができます。ただし、サービスをいつ開始するかをユーザーが選択できるようにして、アプリケーションによる電力消費をユーザーがより詳細に制御することも可能です。たとえば、ボタン クリック イベントに対応するハンドラーの中でサービスを開始することも可能です。

    // Click the event handler for the “Start Location” button.
    private void startLocationButton_Click(object sender, RoutedEventArgs e)
    {
      // The watcher variable was previously declared as type GeoCoordinateWatcher. 
      if (watcher == null)
      {
        watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High); // using high accuracy
        watcher.MovementThreshold = 20; // use MovementThreshold to ignore noise in the signal
    
  2. StatusChanged イベントおよび PositionChanged イベントに対応するイベント ハンドラーを追加します。

        watcher.StatusChanged += new EventHandler<GeoPositionStatusChangedEventArgs>(watcher_StatusChanged);
        watcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(watcher_PositionChanged);
      }
    
  3. ここで、位置情報サービスを開始します。このバージョンの Start() メソッドはサービスからのデータ取得を非同期で開始するので、アプリケーションがサービスの開始とデータの取得を試みている間、ユーザーはアプリケーションの使用を継続できます。

      watcher.Start();
    } // End of the Start button Click handler.
    
  4. StatusChanged イベント ハンドラーを実装します。このイベントは、位置情報サービスのステータスが変化するたびに発生します。GeoPositionStatusChangedEventArgs オブジェクトの中で渡される GeoPositionStatus 列挙値が、サービスの現在のステータスをアプリケーションに伝えます。これを使用してアプリケーション内で位置情報ベースの機能を有効にし、サービスの現在のステータスをユーザーに知らせることができます。サービスのステータスが Disabled である場合は、Permission プロパティを確認して、ユーザーがアプリケーションに対して位置情報サービス機能を無効にしたかどうかを調べることができます。

    // Event handler for the GeoCoordinateWatcher.StatusChanged event.
    void watcher_StatusChanged(object sender, GeoPositionStatusChangedEventArgs e)
    {
        switch (e.Status)
        {
            case GeoPositionStatus.Disabled:
                // The Location Service is disabled or unsupported.
                // Check to see whether the user has disabled the Location Service.
                if (watcher.Permission == GeoPositionPermission.Denied)
                {
                    // The user has disabled the Location Service on their device.
                    statusTextBlock.Text = "you have this application access to location.";
                }
                else
                {
                    statusTextBlock.Text = "location is not functioning on this device";
                }
                break;
    
            case GeoPositionStatus.Initializing:
                // The Location Service is initializing.
                // Disable the Start Location button.
                startLocationButton.IsEnabled = false;
                break;
    
            case GeoPositionStatus.NoData:
                // The Location Service is working, but it cannot get location data.
                // Alert the user and enable the Stop Location button.
                statusTextBlock.Text = "location data is not available.";
                stopLocationButton.IsEnabled = true;
                break;
    
            case GeoPositionStatus.Ready:
                // The Location Service is working and is receiving location data.
                // Show the current position and enable the Stop Location button.
                statusTextBlock.Text = "location data is available.";
                stopLocationButton.IsEnabled = true;
                break;
        }
    }
    
    
  5. 位置情報サービスの準備ができ、データを受け取ると、PositionChanged 位置情報サービスはイベントの生成を開始し、(開発者がハンドラーを実装した場合は) アプリケーションのハンドラーを呼び出します。 イベント ハンドラーで、GeoPositionChangedEventArgs<T> オブジェクトの Position メンバーにアクセスします。Position フィールドは、Timestamp プロパティおよび測定用の位置情報を含む GeoCoordinate プロパティで構成されている GeoPosition オブジェクトを指します。この例では、緯度および経度の値にアクセスします。

    void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
    {
      latitudeTextBlock.Text = e.Position.Location.Latitude.ToString("0.000");
      longitudeTextBlock.Text = e.Position.Location.Longitude.ToString("0.000");
    }
    
  6. デバイスのバッテリー残量を最大にするために、必要がなくなった時点で位置情報サービスを停止してください。この例では、[位置情報の停止] ボタンを実装し、ユーザーが位置情報サービスを停止できるようにします。

    // Click the event handler for the “Start Location” button.
    private void stopLocationButton_Click(object sender, RoutedEventArgs e)
    {
      watcher.Stop();
    }
    
    

表示: