适用于 Android Automotive intent 的 Google 地图

免责声明

本产品/功能将发生变化,并且不受任何服务等级协议 (SLA) 或弃用政策的约束。实现在未来版本中可能会发生变化。

关于本文档随附的软件、数据文件和/或源代码:本产品“按原样”提供,不提供任何形式的保证;Google 明确表示不作任何明示、默示、法定或其他形式的保证,包括但不限于对适销性、特定用途适用性以及不侵犯本产品任何权利的不侵权保证。


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

如需了解详情,请参阅适用于 Android 的 Google 地图 intent

如需详细了解如何将应用部署到搭载 Android Auto 或 Android Automotive OS 的车辆,请参阅 Android for Cars

概览

本页面介绍了可用于 Android Automotive 版 Google 地图的 intent。如需查看详细的 Android 开发者文档,请参阅:

intent 请求

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

  • 操作。所有 Google 地图 intent 都称为查看操作 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

参数

如需启动导航,请将 placeqwaypoints(可选)搭配使用。(可选)将航点标记为充电站,请参阅向 Google 地图发送电动汽车行程计划

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

  • place 将端点设为住址或工作地址。指定住址可导航到用户家,指定工作单位可导航到用户的工作地点。

  • avoid 用于设置路线应尝试避开的地图项。avoid 是可选项,可以设置为以下一项或多项:

    • t:收费路段
    • h:高速公路
    • f(轮渡)
  • waypoints 指定一个或多个中转地点,用于将路线路由到 q 指定的最终目的地。您可使用竖线字符 (|) 来分隔地点,从而指定多个航点,例如 Berlin,Germany|Paris,France。您可以根据需要使用任意数量的航点。 这些航点将按照它们在网址中列出的顺序添加到路线中。每个航点可以是地址或以英文逗号分隔的纬度/经度坐标;并且,您可以在同一 intent 中使用地址和纬度/经度坐标。字符串应进行网址转义,因此“Berlin, Germanyy|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 悉尼和悉尼歌剧院作为航点传递:

  1. Google 悉尼

  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 中提供的数据(经纬度、名称和功率输出)在界面中显示该充电站,并提供该充电站的充电建议。

示例

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

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

目的地顺序:

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

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

  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,输出功率:350 千瓦)

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);