通过 Android intent,您可以在 Google 地图 Android Automotive 版中启动导航。
概览
本页面介绍了您可以与 Google 地图(Android Automotive 版)搭配使用的 intent。如需查看详细的 Android 开发者文档,请参阅以下内容:
意图请求
如需通过 intent 启动 Android Automotive 版 Google 地图,您必须先创建一个 Intent 对象,并指定其操作、URI 和软件包。
操作。所有 Google 地图 intent 都会作为 View 操作
ACTION_VIEW调用。URI。Google 地图 intent 使用经过 URI 编码的字符串,这些字符串指定了所选操作以及执行该操作所需的一些数据。
Package。调用
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 encode() 方法对字符串进行编码。例如:
Uri mapIntentUri = Uri.parse("google.navigation:q=" + Uri.encode("1st & Pike, Seattle"));
显示地图
使用 geo: intent 可在指定位置和缩放级别显示地图。
例如:
geo:latitude,longitude?z=zoom
参数
latitude和longitude用于设置地图的中心点。z用于设置地图的初始缩放级别(可选)。可接受的值范围为 0(整个世界)到 21(单个建筑物)。上限可能会因所选位置的可用地图数据而异。
示例
// Creates an intent that will load a map of San Francisco
Uri gmmIntentUri = Uri.parse("geo:37.7749,-122.4194");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);
搜索地点
使用此 intent 可在指定视口内显示搜索查询:
geo:latitude,longitude?q=query
geo:0,0?q=my+street+address
参数
除了用于显示地图的参数之外,搜索还支持以下参数:
q定义要在地图上突出显示的地点。所有搜索请求都必须提供q参数。它接受地点名称或地址作为位置。该字符串应经过网址转义,因此“City Hall, New York, NY”等地址应转换为City+Hall%2CNew+York%2CNY。
使用坐标自定义调整搜索结果
搜索非常具体的地点时,如果 q 参数中包含纬度和经度,则不一定要提供这些信息。不过,如果您不知道确切地址或查询不明确,可以尝试通过指定坐标来使搜索结果偏向特定区域。例如,对“Main Street”执行地址搜索可能会返回过多结果:
// Searching for "101 Main Street" with no lat/long might return too many results
Uri gmmIntentUri = Uri.parse("geo:0,0?q=101+main+street");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);
向 intent URI 添加纬度和经度会使结果偏向于特定区域:
// Searches for "101 Main Street" near San Francisco
Uri gmmIntentUri = Uri.parse("geo:37.7749,-122.4194?q=101+main+street");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);
沿路线搜索
如果在导航期间发送搜索意图 geo:latitude,longitude?q=query,则会触发沿路线搜索,并且系统会忽略纬度和经度。
搜索预定义类别
为了支持与车辆集成,车载 Google 地图支持显示以下预定义类别的 intent:
| 类别 | 意图类别编码 |
|---|---|
| 加油站 | gas_station |
| 餐馆 | restaurant |
| 咖啡馆 | cafe |
| 停车 | parking |
| 电动车辆充电站 | electric_vehicle_charging_station |
类别 intent 的格式为 geo:lat,lng?c=category。
无论用户的语言区域设置如何,都使用 c=<pre-defined category>。
Google 地图会以适合此类别的位置信息显示相关结果。例如:
// Search for gas stations nearby
Uri gmmIntentUri = Uri.parse("geo:0,0?c=gas_station");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);
其他分类搜索
如果您在用户语言区域中传递宽泛搜索字词(例如“餐馆”或“咖啡店”),Android Automotive 版 Google 地图会搜索符合条件的商家信息。如果 geo: intent 中提供了特定的纬度和经度,则搜索会以该位置为中心。如果未指定位置(例如 geo:0,0),Google 地图会尝试查找附近的商家信息。例如:
// Search for restaurants nearby
Uri gmmIntentUri = Uri.parse("geo:0,0?q=restaurants");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);
您还可以通过指定缩放参数和查询字符串来进一步偏向搜索结果。在以下示例中,添加 10 的缩放级别会尝试在城市级别(而非附近)查找餐馆:
Uri gmmIntentUri = Uri.parse("geo:37.7749,-122.4194?z=10&q=restaurants");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
mapIntent.setPackage("com.google.android.apps.maps");
startActivity(mapIntent);
启动精细导航
如需查看有关在其他 Android 设备上启动精细导航的文档,请参阅在适用于 Android 的 Google 地图 intent 中启动精细导航。
使用此 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。您可以根据需要使用任意数量的航点。航点将按照其在网址中列出的顺序添加到路线中。每个航点都可以是地址或以逗号分隔的纬度和经度坐标;您可以在同一 intent 中同时使用地址和纬度/经度坐标。字符串应经过网址转义,因此“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 悉尼和悉尼歌剧院作为航点:
Google 悉尼办事处
悉尼歌剧院
澳大利亚悉尼塔龙加动物园
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 地图之间同步充电站信息,帮助驾驶员保持充足的电动汽车电池电量,以便到达目的地。
对于充电站、行程意图:
- 必须包含名称和经纬度
- 可选择包含功率输出,用于计算充电时间
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 中提供的充电站数据(经纬度、名称和功率输出)在界面中显示此充电站,并提供此充电站的充电建议。
示例
以下示例说明了如何针对各种电动汽车行程规划场景构建 intent,包括通过多个充电站导航和处理未知功率输出。
通过多个充电站导航到最终目的地
以下 intent 会通过两个充电站(ChargePoint 和 Evie)导航到最终目的地 Port Macquarie NSW。
目的地顺序:
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=show_alternates |
Google 地图会打开备选路线屏幕(仅在导航时有效)。 |
geo.action:?act=route_overview |
Google 地图会打开路线概览屏幕(仅在导航时有效)。 |
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=my_location |
Google 地图会重新以用户所在位置为中心显示地图。 |
geo.action:?act=show_map |
Google 地图会关闭所有打开的卡片,并返回到地图视图。 |
geo.action:?act=query_current_road |
Google 地图会播报当前道路。 |
geo.action:?act=query_destination |
Google 地图会播报目的地。 |
geo.action:?act=traffic_report |
Google 地图会语音播报路况报告。 |
geo.action:?act=clear_search_results |
Google 地图会关闭搜索结果界面(如果已打开)。 |
geo.action:?act=open_destination_input |
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 将选择列表中的第一个结果)。
|
