适用于 Android Automotive 的 Google 地图 Intent

通过 Android Automotive intent,您可以在 Google 地图中启动导航。

概览

本页面介绍了可与适用于 Android Automotive 的 Google 地图结合使用的 intent。有关详细的 Android 开发者文档,请参阅以下内容

Intent 请求

要通过 intent 启动适用于 Android Automotive 的 Google 地图,您必须首先创建一个 Intent 对象,并指定其操作、URI 和软件包。

  • 操作。所有 Google 地图 intent 都作为 View 操作(ACTION_VIEW)调用。

  • URI。Google 地图 intent 使用 URI 编码字符串 来指定所选操作以及执行操作所需的一些数据。

  • 软件包。调用 setPackage("com.google.android.apps.maps") 可确保 Android 版 Google 地图应用处理该 Intent。如果未设置软件包,系统会确定哪些应用可以处理该 Intent。如果提供多个应用,您可能会被询问要使用哪个应用。

创建 Intent 后,您可以通过多种方式请求系统启动相关应用。一种常用方法是将 Intent 传递给 startActivity() 方法。系统将启动必要的应用(在此情况下为 Google 地图)并启动相应的 Activity

// Create a Uri from an intent string. Use the result to create an Intent.
Uri mapIntentUri =
Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia");
// Create an Intent from mapIntentUri. Set the action to ACTION_VIEW
Intent mapIntent = new Intent(Intent.ACTION_VIEW, mapIntentUri);
// Make the Intent explicit by setting the Google Maps package
mapIntent.setPackage("com.google.android.apps.maps");
// Attempt to start an activity that can handle the Intent
startActivity(mapIntent);

如果系统无法识别可以响应 Intent 的应用,您的应用可能会崩溃。因此,在向用户呈现这些 intent 之一之前,请务必先验证是否已安装接收应用。

要验证应用是否可以接收 intent,请在您的 Intent 对象上调用 resolveActivity()。如果结果为非 null,则至少有一个应用可以处理该 intent,并且可以安全地调用 startActivity()。如果结果为 null,则不应使用该 intent,如果可能,应禁用调用该 intent 的功能。

if (mapIntent.resolveActivity(getPackageManager()) != null) {
...
}

例如,要启动前往悉尼塔龙加动物园的逐向导航,您可以使用以下代码

Uri mapIntentUri = Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, mapIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
if (mapIntent.resolveActivity(getPackageManager()) != null) {
startActivity(mapIntent);
}

URI 编码查询字符串

传递给 Google 地图 Intent 的所有字符串都必须经过 URI 编码。例如,字符串“1st & Pike, Seattle”应变为 1st%20%26%20Pike%2C%20Seattle。字符串中的空格可以使用 %20 编码或替换为加号 (+)。

您可以使用 android.net.Uri parse() 方法对字符串进行编码。例如

Uri mapIntentUri = Uri.parse("google.navigation:q=" + Uri.encode("1st & Pike, Seattle"));

启动逐向导航

使用此 intent 启动 Google 地图导航,提供前往一个或多个指定地址或坐标的逐向路线。路线始终从用户的当前位置开始。

google.navigation:q=a+street+address
google.navigation:q=latitude,longitude
google.navigation:place=placename

参数

要启动导航,请使用 placeq 以及可选的 waypoints。要将某个途经点标记为充电站,请参阅向 Google 地图发送电动汽车行程规划

  • q 设置导航搜索的终点。这可以是纬度和经度,也可以是查询格式的地址。如果查询字符串返回多个结果,则会选择第一个结果。

  • place 将终点设置为住家或公司。指定 home 可导航到用户的住家,指定 work 可导航到用户的工作场所。

  • avoid 设置路线应尝试避开的特征。avoid 是可选参数,可以设置为以下一个或多个值:

    • t 表示收费站
    • h 表示高速公路
    • f 表示渡轮
  • waypoints 指定一个或多个中间地点,以将路线导航到由 q 指定的最终目的地。您可以使用管道符 (|) 分隔地点来指定多个途经点,例如 Berlin,Germany|Paris,France。您可以根据需要使用任意数量的途经点。途经点将按照它们在 URL 中列出的相同顺序添加到路线中。每个途经点可以是地址或逗号分隔的纬度经度坐标;而且,您可以在同一个 intent 中同时包含地址和纬度经度坐标。字符串应进行 URL 转义,因此像“Berlin,Germany|Paris,France”这样的途经点应转换为 Berlin%2CGermany%7CParis%2CFrance

示例

此 Intent 将请求前往澳大利亚悉尼塔龙加动物园的逐向导航

Uri mapIntentUri = Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, mapIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

如果您不想支付通行费或乘坐渡轮,您可以请求尝试避开这些情况的路线

Uri mapIntentUri = Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia&avoid=tf");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, mapIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

或者,如果您想导航到您的住家,请使用

Uri mapIntentUri = Uri.parse("google.navigation:place=home");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, mapIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

要按顺序启动前往以下三个地址的逐向导航,请将塔龙加动物园作为最终目的地 q,并将 Google Sydney 和悉尼歌剧院作为途经点

  1. Google Sydney

  2. 悉尼歌剧院

  3. 澳大利亚悉尼塔龙加动物园

Uri mapIntentUri = Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia&waypoints=Google+Sydney%7CSydney+Opera+House");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, mapIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

q 类似,您可以通过逗号分隔的纬度和经度来表示任何途经点,而不是地址。例如,要在传递悉尼歌剧院的纬度经度而不是地址时启动相同的导航

Uri mapIntentUri = Uri.parse("google.navigation:q=Taronga+Zoo,+Sydney+Australia&waypoints=Google+Sydney%7C-33.856159,151.215256");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, mapIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

将电动汽车行程规划发送到 Google 地图

使用此多目的地导航 intent,将某些目的地指定为电动汽车 (EV) 充电站。此 intent 扩展了多途经点 intent,通过在电动汽车行程规划应用和 Google 地图之间同步充电站信息,帮助驾驶员保持足够的电动汽车电池电量到达目的地。

对于充电站,行程 intent

  • 必须包含名称和经纬度
  • 可选择包含功率输出,用于计算充电时间

Google 使用充电站名称和经纬度来查找匹配的充电站地点,以显示丰富的数据,例如连接器类型、总数、速度和实时可用性、支持的付款方式以及主机兴趣点 (POI)。例如,导航最后一段的室外停车场内的行车路线、营业时间、评分。为确保充电站与 Google 数据良好匹配,请使用 <brand name>,例如 ChargePoint

参数

以下参数允许您指定最终目的地和任何途经点的详细信息,包括那些指定为电动汽车充电站的途经点。

最终目的地

要将充电站设置为最终目的地,请使用

  • q:必须包含充电站的经纬度值。
  • q_type1 指定最终目的地为充电站。
  • q_name:最终目的地的名称。如果 q_type1,则此项为必填项。
  • q_power_output_kw:充电站以千瓦为单位的功率输出的双精度数字。可选。

途经点

对于途经点,所有参数都是并行的、以 | 分隔的值数组,其顺序与途经点相同,不包括最终目的地。并行数组中的元素数量不匹配将被视为格式错误的 intent。

要添加一个或多个充电站途经点,请使用以下参数,所有这些参数都是可选的。如果其中一个目的地被标记为充电站,则该目的地的途经点名称变为必填项。

  • waypoints:逐向导航 intent 中描述的途经点列表。对于充电站途经点,必须是经纬度值。

  • waypoint_types:按数字指定的每个途经点的类型。0 表示任何停靠点(默认值),1 表示充电站。

  • waypoint_names:途经点名称。此字段对于充电站是必填项。

  • waypoint_power_outputs_kw:充电站功率(千瓦)的双精度数字。对于充电站,您可以选择指定途经点功率输出值,如果未找到匹配的充电站,则此值将用作备用值。空槽表示未提供任何值。

用户体验 (UX) 行为

对于包含多个目的地的行程 intent,将显示路线概览屏幕,但导航不会自动开始。

对于格式正确的 intent,Google 地图将显示行程的路线概览屏幕。路线概览屏幕将显示 intent 中的所有途经点和最终目的地,并在适用时提供充电建议。

对于任何标记为充电站的途经点或最终目的地,Google 地图将在 Google 数据库中搜索匹配地点。为确保充电站显示最佳信息

  • 如果找到匹配项,Google 地图会使用 Google 数据在用户界面 (UI) 中显示充电站,并为该充电站提供充电建议。

  • 如果未找到匹配项,则 intent 中提供的充电站数据(经纬度、名称和功率输出)将用于在 UI 中显示此充电站,并在此充电站提供充电建议。

示例

以下示例说明了如何为各种电动汽车行程规划场景构建 intent,包括通过多个充电站导航以及处理未知功率输出。

通过多个充电站导航到最终目的地

以下 intent 通过两个充电站 ChargePoint 和 Evie 导航到最终目的地新南威尔士州麦夸里港。

目的地顺序

  1. ChargePoint 充电站(位置:-32.9599188,151.6240806,功率输出:6.6kw)

  2. Evie 充电站(位置:-31.9432539,152.4699808,功率输出:350kw)

  3. 新南威尔士州麦夸里港

Uri mapIntentUri =
    Uri.parse(
        "google.navigation:q=Port+Macquarie+NSW"
            + "&waypoints=-32.9599188%2C151.6240806%7C-31.9432539%2C152.4699808"
            + "&waypoint_types=1%7C1"
            + "&waypoint_names=ChargePoint+Charging+Station%7CEvie+Charging+Station"
            + "&waypoint_power_outputs_kw=6.6%7C350");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, mapIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

未知功率输出

如果功率输出值未知,请将 waypoint_power_outputs_kw 的相关槽留空。或者,如果所有槽都为空,则无需指定 waypoint_power_outputs_kw 参数。

目的地顺序

  1. ChargePoint 充电站(位置:-32.9599188,151.6240806,功率输出:未知)

  2. 新南威尔士州麦夸里港

Uri mapIntentUri =
    Uri.parse(
        "google.navigation:q=Port+Macquarie+NSW"
            + "&waypoints=-32.9599188%2C151.6240806"
            + "&waypoint_types=1"
            + "&waypoint_names=ChargePoint+Charging+Station");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, mapIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

将最终目的地标记为充电站

要将最终目的地标记为充电站,请指定 q_typeq_nameq_power_output_kw 参数。

目的地顺序

  1. 澳大利亚悉尼塔龙加动物园

  2. ChargePoint 充电站(位置:-32.9599188,151.6240806,功率输出:未知)

  3. Evie 充电站(位置:-31.9432539,152.4699808,功率输出:350kw)

Uri mapIntentUri =
    Uri.parse(
        "google.navigation:q=-31.9432539,152.4699808&q_type=1&q_name=Evie+Charging+Station&q_power_output_kw=350"
            + "&waypoints=Taronga+Zoo%2C+Sydney+Australia%7C-32.9599188%2C151.6240806"
            + "&waypoint_types=0%7C1"
            + "&waypoint_names=%7CChargePoint+Charging+Station"
            + "&waypoint_power_outputs_kw=%7C");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, mapIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);

操作 intent

提供以下带有界面的操作 intent

操作 说明
geo.action:?act=mute 静音所有导航语音提示。
geo.action:?act=unmute 取消静音导航语音提示。
geo.action:?act=show_traffic 在地图上显示交通线路。
geo.action:?act=hide_traffic 在地图上隐藏交通线路。
geo.action:?act=show_satellite 在地图上显示卫星图像。
geo.action:?act=hide_satellite 在地图上隐藏卫星图像。
geo.action:?act=query_next_turn Google 地图播报下一个转弯(仅在导航时有效)。
geo.action:?act=distance_to_next_turn Google 地图播报到下一个转弯的距离(仅在导航时有效)。
geo.action:?act=time_to_next_turn Google 地图播报到下一个转弯所需的时间(仅在导航时有效)。
geo.action:?act=distance_to_destination Google 地图播报到目的地的距离(仅在导航时有效)。
geo.action:?act=go_back Google 地图在用户界面中返回上一屏幕。
geo.action:?act=query_current_road Google 地图播报当前道路。
geo.action:?act=query_destination Google 地图播报目的地。
geo.action:?act=apply_electric_vehicle_connector_filter 对电动汽车充电站搜索结果应用连接器类型过滤器。
geo.action:?act=remove_electric_vehicle_connector_filter 移除电动汽车充电站搜索结果的连接器类型过滤器。
geo.action:?act=apply_electric_vehicle_payment_filter 对电动汽车充电站搜索结果应用支付过滤器。
geo.action:?act=remove_electric_vehicle_payment_filter 移除电动汽车充电站搜索结果的支付过滤器。
geo.action:?act=apply_electric_vehicle_fast_charging_filter 对电动汽车充电站搜索结果应用快速充电过滤器。
geo.action:?act=remove_electric_vehicle_fast_charging_filter 移除电动汽车充电站搜索结果的快速充电过滤器。
geo.action:?act=avoid_tolls 如果用户正在导航,则指示 Google 地图避开有收费站的路线。如果当前路线有收费站,这可能会导致重新规划路线。
geo.action:?act=allow_tolls 如果用户正在导航,则指示 Google 地图允许有收费站的路线。如果允许收费站能提供更好的路线,这可能会导致重新规划路线。
geo.action:?act=avoid_ferries 如果用户正在导航,则指示 Google 地图避开有渡轮的路线。如果当前活动路线有渡轮,这可能会导致重新规划路线。
geo.action:?act=allow_ferries 如果用户正在导航,则指示 Google 地图允许有渡轮的路线。如果允许渡轮能提供更好的路线,这可能会导致重新规划路线。
geo.action:?act=avoid_highways 如果用户正在导航,则指示 Google 地图避开有高速公路的路线。如果当前活动路线有高速公路,这可能会导致重新规划路线。
geo.action:?act=allow_highways 如果用户正在导航,则指示 Google 地图允许有高速公路的路线。如果允许高速公路能提供更好的路线,这可能会导致重新规划路线。
geo.action:?act=eta 如果用户正在导航,Google 地图会播报目的地的预计到达时间(例如,上午 9:15)。
geo.action:?act=time_to_destination 如果用户正在导航,Google 地图会播报到目的地的预计时间(例如,15 分钟)。
geo.action:?act=exit_navigation 退出导航。
geo.action:?act=select_search_result&id=0 如果屏幕上显示搜索结果(如附带图像所示),则根据提供的 ID 参数开始导航到第 n 个结果。请注意,索引是基于 0 的(即 geo.action:?act=select_search_result&id=0 将选择列表中的第一个结果)。

Search results shown on screen