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

Windows Phone 8 で道順の要求に応答する方法

2014/06/18

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

ここでは、電話にインストールされている他のアプリから呼び出されたときに、車または徒歩での道順に関する要求に応答するアプリの作成方法について説明します。他のアプリは、ms-drive-to または ms-walk-to URI スキームを使用して道順を要求します。

重要:重要:

ターンバイターンの方向指示の提供方法については、このトピックでは説明しません。このトピックのコード例は、要求で指定された目的地を単純に表示します。

Icon to indicate an SDK sample

このトピックで説明している一部のタスクを実演するサンプルについては、「Navigation URI scheme sample」を参照してください。

URI を使用して別のアプリを起動する詳細については、「Windows Phone 8 のファイルおよび URI の関連付けを使用してアプリを自動起動する」を参照してください。道順を要求するアプリを作成する方法については、「Windows Phone 8 で車または徒歩での道順を要求する方法」を参照してください。

音声合成出力を追加する可能性を検討します。詳細については、「Windows Phone 8 の音声合成 (TTS)」を参照してください。

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

URI の関連付けの処理を登録するには

  • アプリ マニフェスト ファイルの Extensions 要素で、次の形式を使用してナビゲーション プロトコルまたはアプリが処理できるプロトコルを指定します。この要素は Tokens 要素の直後に指定する必要があります。アプリでは両方の URI の関連付けを処理する必要はありません。アプリ マニフェスト ファイルの編集の詳細については、「Windows Phone 8 のアプリ マニフェスト ファイルを変更する方法」を参照してください。

        <Extensions>
          <Protocol Name="ms-drive-to" NavUriFragment="encodedLaunchUri=%s" TaskID="_default"/>
          <Protocol Name="ms-walk-to" NavUriFragment="encodedLaunchUri=%s" TaskID="_default"/>
        </Extensions>
    
    

URI をリッスンするには

  1. 呼び出し元アプリから受け取った要求をアプリ内のページにマップする URI マッピング クラスを作成します。URI を解析し、ページに必要な引数を指定して ShowDestination.xaml ページを呼び出す URI マッピング クラスの例を次に示します。

        class DirectionsRequestUriMapper : UriMapperBase
        {
    
            public override Uri MapUri(Uri uri)
            {
                string tempUri = Uri.UnescapeDataString(uri.ToString());
    
                // Does the Uri contain a request for driving directions or walking directions?
                if (tempUri.Contains("ms-drive-to") || tempUri.Contains("ms-walk-to"))
                {
                    // Parse the Uri.
                    char[] uriDelimiters = { '?', '=', '&' };
                    string[] uriParameters = tempUri.Split(uriDelimiters);
                    string destLatitude = uriParameters[4];
                    string destLongitude = uriParameters[6];
                    string destName = uriParameters[8];
    
                    // Map the request for directions to the ShowDestination page of the app.
                    return new Uri(
                        "/ShowDestination.xaml?" +
                        "latitude=" + destLatitude + "&" +
                        "longitude=" + destLongitude + "&" +
                        "name=" + destName,
                        UriKind.Relative);
                }
                // Otherwise, handle the Uri normally.
                return uri;
            }
        }
    

    コード例では、最初に呼び出し元アプリから受け取った URI をデコードします。

    このトピックで前に示した例からアプリが受け取るエンコードされた URI の例を次に示します。

    /Protocol?encodedLaunchUri=ms-drive-to%3A%3Fdestination.latitude%3D47.6451413797194%26destination.longitude%3D-122.141964733601%26destination.name%3DRedmond%2C%20WA

    例では、次に URI を各コンポーネントに分割します。

    1. (配列インデックス 0) /Protocol

    2. (配列インデックス 1) uri

    3. (配列インデックス 2) ms-drive-to

    4. (配列インデックス 3) destination.latitude

    5. (配列インデックス 4) 47.6451413797194

    6. (配列インデックス 5) destination.longitude

    7. (配列インデックス 6) -122.141964733601

    8. (配列インデックス 7) destination.name

    9. (配列インデックス 8) Redmond, WA

    例では、最後に次の URI をアセンブルし、ページに必要な引数を指定して ShowDestination.xaml ページを呼び出します。

    /ShowDestination.xaml?latitude=47.6451413797194&longitude=-122.141964733601&name=Redmond, WA

  2. ソリューション エクスプローラーから App.xaml.cs コード ファイルを開きます。次のコード行を InitializePhoneApplication メソッドに追加して、URI マッピング クラスを有効にします。

            private void InitializePhoneApplication()
            {
                ...
    
                RootFrame = new PhoneApplicationFrame();
                ...
    
                // Assign the Uri mapper class to the application frame.
                RootFrame.UriMapper = new DirectionsRequestUriMapper();
    
                ...
    
            }
    

URI を処理するには

  1. 指定された目的地への道順の要求を処理するターゲット ページを作成します。このコード例は、URI でページに渡されたパラメーター値を単純に表示する ShowDestination.xaml という名前のページを作成します。

    要求で開始点が指定されていないため、現在の位置であると見なされます。ロケーション サービスで現在の位置を取得する前に、ユーザーが電話の位置の使用に同意していることを確認します。詳しい説明とコード例については、「Windows Phone 8 で電話の現在位置を取得する方法」を参照してください。

  2. ShowDestination.xaml で、パラメーター値を表示するテキスト ボックスをページに追加します。

            <!--ContentPanel - place additional content here-->
            <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
                <TextBox x:Name="tbDestinationParams" HorizontalAlignment="Left" Height="516" Margin="10,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="436" IsReadOnly="True"/>
            </Grid>
    
  3. ShowDestination.xaml.cs で、ページの OnNavigatedTo イベントで URI を処理するコードを追加します。このコードは、URI でページに渡されたパラメーター値を単純に表示します。

            protected override void OnNavigatedTo(NavigationEventArgs e)
            {
                base.OnNavigatedTo(e);
    
                    // Extract the arguments from the query string passed to the page.
                    IDictionary<string, string> uriParameters = this.NavigationContext.QueryString;
                    string destLatitude = uriParameters["latitude"];
                    string destLongitude = uriParameters["longitude"];
                    string destName = uriParameters["name"];
    
                    this.tbDestinationParams.Text = "\tlatitude = " + destLatitude + "\r\n" +
                                                    "\tlongitude = " + destLongitude + "\r\n" +
                                                    "\tname = " + destName;
    
            }
    

次のスクリーン ショットは、前の例によって表示されたパラメーター値を示しています。

An app that handles ms-drive-to requests

表示: