通过 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
参数
要启动导航,请使用 place
或 q
以及可选的 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 和悉尼歌剧院作为途经点
Google Sydney
悉尼歌剧院
澳大利亚悉尼塔龙加动物园
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_type
:1
指定最终目的地为充电站。q_name
:最终目的地的名称。如果q_type
为1
,则此项为必填项。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 导航到最终目的地新南威尔士州麦夸里港。
目的地顺序
ChargePoint 充电站(位置:-32.9599188,151.6240806,功率输出:6.6kw)
Evie 充电站(位置:-31.9432539,152.4699808,功率输出:350kw)
新南威尔士州麦夸里港
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
参数。
目的地顺序
ChargePoint 充电站(位置:-32.9599188,151.6240806,功率输出:未知)
新南威尔士州麦夸里港
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_type
、q_name
和 q_power_output_kw
参数。
目的地顺序
澳大利亚悉尼塔龙加动物园
ChargePoint 充电站(位置:-32.9599188,151.6240806,功率输出:未知)
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 将选择列表中的第一个结果)。 |