精细导航数据 Feed 会向并非专为基于地图的导航指引而设计的设备提供仅导航信息。它会提供即将到来的操作,并包含您提供的元素:
- 图标(左转、右转、掉头)
- 环形交叉路中的转弯编号
- 道路名称
- 到达下一个导航步骤或最终目的地的预计距离和时间
您可以使用精细导航 Feed 来创建不适合使用完整 Navigation SDK 界面的体验,例如 Android Auto 或无法使用完整 Android 堆栈的小屏幕显示器。例如,您可以将其用于两轮车辆驾驶员,向他们投射仅导航指引,帮助他们以最少的干扰更快、更自信地到达目的地。
如需使用该 SDK,您需要创建一个服务并向 Navigation SDK for Android 注册该服务,以便该服务能够实时接收新的导航信息(在导航期间大约每秒一次)。
本文档将向您展示如何创建和注册导航服务,该服务会从 SDK 接收导航信息,并向接收设备提供导航状态。
概览
本部分总结了启用精细导航功能的简要流程。
使用 TurnByTurn 功能
以下是启用精细导航功能的简要步骤。后续部分将详细介绍每个步骤。
创建服务以接收导航更新
Navigation SDK 会绑定到您的 TurnByTurn 服务,并 通过 Android Messenger 向其发送导航更新。您可以为这些更新创建新的导航服务,也可以使用现有服务。
使用服务接收导航更新的好处是,该服务可以位于单独的后台进程中。
以下示例中的服务会接收导航信息,并使用 TurnByTurnManager 将数据转换为包含导航详细信息的 NavInfo 对象。
/** * Receives turn-by-turn navigation information forwarded from NavSDK. */ public class NavInfoReceivingService extends Service { /** The messenger used by the service to receive nav step updates. */ private Messenger incomingMessenger; private TurnByTurnManager turnByTurnManager; private final class IncomingNavStepHandler extends Handler { public IncomingNavStepHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { // Identify the message through the msg.what field. if (TurnByTurnManager.MSG_NAV_INFO == msg.what) { // Extract the NavInfo object using the TurnByTurnManager. NavInfo navInfo = turnByTurnManager .readNavInfoFromBundle(msg.getData())); // Do something with the NavInfo } } } @Nullable @Override public IBinder onBind(Intent intent) { return incomingMessenger.getBinder(); } @Override public void onCreate() { turnByTurnManager = TurnByTurnManager.createInstance(); HandlerThread thread = new HandlerThread("NavInfoReceivingService", Process.THREAD_PRIORITY_DEFAULT); thread.start(); incomingMessenger = new Messenger( new IncomingNavStepHandler(thread.getLooper())); }
消息代码
NavInfo 消息可以通过
Message.what
Message 类的字段来识别,该字段设置为
TurnByTurnManager.MSG_NAV_INFO 的值。
注册服务以接收导航更新
以下代码段会注册导航服务。
boolean isNavInfoReceivingServiceRegistered = navigator.registerServiceForNavUpdates( getPackageName(), NavInfoReceivingService.class.getName(), numNextStepsToPreview);
启动和停止服务
只要 Navigation SDK 绑定到导航服务,该服务就会处于活跃状态。您可以手动调用 startService() 和 stopService() 来控制导航服务的生命周期,但当您向 Navigation SDK 注册服务时,您的服务会自动启动,并且只有在您取消注册时才会停止。根据您设置应用的方式,您可能
需要考虑启动前台服务,如 Android
文档 服务
概览中所述。
取消注册服务
如需停止接收导航更新,请从 Navigation SDK 取消注册该服务。
navigator.unregisterServiceForNavUpdates();
了解导航状态
使用 NavInfo.getNavState() 获取当前导航状态,该状态为以下状态之一:
Enroute -
ENROUTE状态表示引导式导航处于 活跃状态,用户正在按照提供的路线行驶。系统会提供有关当前即将到来的操作步骤的信息。Rerouting -
REROUTING表示导航正在进行中,但 导航器正在寻找新路线。由于尚未找到新路线,因此系统不会提供即将到来的操作步骤。在示例应用中,导航信息显示屏中会显示“正在重新规划路线…”消息。找到路线后,系统会发送一条NavInfo消息,其状态为ENROUTE。已停止 -
STOPPED表示导航已结束。例如,当用户在应用中退出导航时,导航会停止。在示例应用中,STOPPED状态会清除导航信息显示屏,以防止显示残留的步骤说明。
填充 Feed 显示屏
现在,您已设置精细导航服务,本部分将介绍可用于填充精细导航 Feed 的指引卡片的视觉和文本元素。
导航卡片信息字段
当用户进入引导式导航时,顶部会显示一张导航卡片,其中包含从 Navigation SDK 填充的导航数据。相关图片显示了这些基本导航元素的示例。
下表显示了导航信息的字段以及您可以在哪里找到这些字段。
| 每个导航步骤的字段 | 整个行程的字段 |
|---|---|
位于 StepInfo 中 |
位于 NavInfo 中 |
| 完整道路名称 | 剩余时间 |
| 操作图标 | 到达目的地的距离 |
| 到达下一步的距离 | |
| 车道导航字段 |
车道导航
Navigation SDK 会将导航
转弯卡片中的车道表示为
Lane
和
LaneDirection
数据对象。一个 Lane 对象表示导航期间的特定车道,并
包含 LaneDirection 对象列表,这些对象描述了可以从该车道进行的所有转弯。
用户应在车道中采取的建议方向由 isRecommended 字段标记。
车道导航示例
以下代码段说明了上述显示的车道的数据表示形式。
// Lane 1
LaneDirections = [{/*laneShape=*/ STRAIGHT, /*isRecommended=*/ false},
{/*laneShape=*/ SLIGHT_LEFT, /*isRecommended=*/ true}]
// Lane 2
LaneDirections = [{/*laneShape=*/ STRAIGHT, /*isRecommended=*/ false}]
为操作创建图标
Maneuver
枚举定义了导航期间可能发生的每种操作,您可以从 StepInfo.getManeuver() 方法获取给定步骤的操作。
您必须创建操作图标,并将其与关联的操作配对。
对于某些操作,您可以设置与图标的一对一映射,例如 DESTINATION_LEFT 和 DESTINATION_RIGHT。不过,由于某些操作类似,您可能需要将多个操作映射到单个图标。例如,TURN_LEFT 和 ON_RAMP_LEFT 都可以映射到左转图标。
某些操作包含额外的 clockwise 或 counterclockwise 标签,
SDK 会根据国家/地区的驾驶侧来确定这些标签。例如,在靠左行驶的国家/地区,驾驶员会顺时针方向驶入环形交叉路或掉头,而在靠右行驶的国家/地区,驾驶员会逆时针方向驶入环形交叉路或掉头。Navigation SDK 会检测操作是在靠左行驶还是靠右行驶的情况下发生,并输出适当的操作。因此,对于顺时针操作和逆时针操作,您的操作图标可能有所不同。
展开即可查看不同操作的示例图标
| 示例图标 | TurnByTurn 操作 |
|---|---|
![]() |
DEPARTUNKNOWN |
![]() |
STRAIGHTON_RAMP_UNSPECIFIEDOFF_RAMP_UNSPECIFIEDNAME_CHANGE
|
![]() |
TURN_RIGHTON_RAMP_RIGHT
|
![]() |
TURN_LEFTON_RAMP_LEFT
|
![]() |
TURN_SLIGHT_RIGHTON_RAMP_SLIGHT_RIGHTOFF_RAMP_SLIGHT_RIGHT
|
![]() |
TURN_SLIGHT_LEFTON_RAMP_SLIGHT_LEFTOFF_RAMP_SLIGHT_LEFT
|
![]() |
TURN_SHARP_RIGHTON_RAMP_SHARP_RIGHTOFF_RAMP_SHARP_RIGHT
|
![]() |
TURN_SHARP_LEFTON_RAMP_SHARP_LEFTOFF_RAMP_SHARP_LEFT
|
![]() |
TURN_U_TURN_COUNTERCLOCKWISEON_RAMP_U_TURN_COUNTERCLOCKWISEOFF_RAMP_U_TURN_COUNTERCLOCKWISE
|
![]() |
TURN_U_TURN_CLOCKWISEON_RAMP_U_TURN_CLOCKWISEOFF_RAMP_U_TURN_CLOCKWISE
|
![]() |
ROUNDABOUT_SHARP_RIGHT_COUNTERCLOCKWISE
|
![]() |
ROUNDABOUT_SHARP_RIGHT_CLOCKWISE
|
![]() |
ROUNDABOUT_RIGHT_COUNTERCLOCKWISE
|
![]() |
ROUNDABOUT_RIGHT_CLOCKWISE
|
![]() |
ROUNDABOUT_SLIGHT_RIGHT_COUNTERCLOCKWISE
|
![]() |
ROUNDABOUT_SLIGHT_RIGHT_CLOCKWISE
|
![]() |
ROUNDABOUT_STRAIGHT_COUNTERCLOCKWISE
|
![]() |
ROUNDABOUT_STRAIGHT_CLOCKWISE
|
![]() |
ROUNDABOUT_SLIGHT_LEFT_COUNTERCLOCKWISE
|
![]() |
ROUNDABOUT_SLIGHT_LEFT_CLOCKWISE
|
![]() |
ROUNDABOUT_LEFT_COUNTERCLOCKWISE
|
![]() |
ROUNDABOUT_LEFT_CLOCKWISE
|
![]() |
ROUNDABOUT_SHARP_LEFT_COUNTERCLOCKWISE
|
![]() |
ROUNDABOUT_SHARP_LEFT_CLOCKWISE
|
![]() |
ROUNDABOUT_U_TURN_COUNTERCLOCKWISE
|
![]() |
ROUNDABOUT_U_TURN_CLOCKWISE
|
![]() |
ROUNDABOUT_COUNTERCLOCKWISE
|
![]() |
ROUNDABOUT_CLOCKWISE
|
![]() |
ROUNDABOUT_EXIT_COUNTERCLOCKWISE
|
![]() |
ROUNDABOUT_EXIT_CLOCKWISE
|
![]() |
MERGE_RIGHTOFF_RAMP_RIGHT
|
![]() |
MERGE_LEFTOFF_RAMP_LEFT
|
![]() |
FORK_RIGHTTURN_KEEP_RIGHTON_RAMP_KEEP_RIGHTOFF_RAMP_KEEP_RIGHT
|
![]() |
FORK_LEFTTURN_KEEP_LEFTON_RAMP_KEEP_LEFTOFF_RAMP_KEEP_LEFT
|
![]() |
MERGE_UNSPECIFIED
|
![]() |
DESTINATION
|
![]() |
DESTINATION_RIGHT
|
![]() |
DESTINATION_LEFT
|
![]() |
FERRY_BOAT
|
![]() |
FERRY_TRAIN
|
使用生成的图标
为了方便 Android Auto 用例,Navigation SDK 支持生成操作和车道导航图标。这些图标符合 Android Auto Car App 库的图片尺寸调整指南,该指南建议以 500 x 74 dp 的边界框为目标。如需了解详情,请参阅 Android 参考文档中的 setsLaneImage 和 CarIcon 。
图标生成示例
NavigationUpdatesOptions options =
NavigationUpdatesOptions.builder()
.setNumNextStepsToPreview(numNextStepsToPreview)
.setGeneratedStepImagesType(GeneratedStepImagesType.BITMAP)
.setDisplayMetrics(getResources().getDisplayMetrics())
.build();
boolean isRegistered =
navigator.registerServiceForNavUpdates(
getPackageName(),
NavInfoReceivingService.class.getName(),
options);
启用图标生成后,TurnbyTurn StepInfo 对象会使用图标填充 maneuverBitmap 和 lanesBitmap 字段。
后续步骤
- 对于 Android Auto 应用:







































