MSDN Library
信息
您所需的主题如下所示。但此主题未包含在此库中。

如何响应 Windows Phone 8 的路线请求

2014/6/18

仅适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1

本主题介绍如何编写一个应用,以便在手机上安装的另一应用调用该应用时响应行车路线或步行路线的请求。另一应用通过使用 ms-drive-toms-walk-to URI 方案来请求路线。

重要说明重要说明:

如何提供逐向导航不在本主题的范围内并且未在此处进行描述。本主题中的代码示例仅显示请求中的指定目的地。

Icon to indicate an SDK sample

要获取演示本主题中介绍的某些任务的示例,请下载导航 URI 方案示例

有关使用 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 映射类的示例,它可以分析 URI 并使用页面请求的参数调用 ShowDestination.xaml 页面。

        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)/协议

    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. 创建目标页面,该页面可处理到指定目的地的路线的请求。此示例将创建名为 ShowDestination.xaml 的页面,它仅显示传递到 URI 中页面的参数值。

    未在请求中指定起始点,因此将假定为当前位置。在您使用位置服务获取当前位置之前,请确保用户已同意使用手机的位置。有关更多信息和示例代码,请参见如何在 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

显示:
© 2016 Microsoft