即時路線資料動態饋給會為未設計地圖導航指引的裝置,提供僅限導航的資訊。這項功能會根據您提供的元素,顯示即將進行的動作:
- 圖示 (向左、向右、迴轉)
- 迴轉道中的數字
- 道路名稱
- 預估距離和時間,直到抵達下一個導航步驟或最終目的地
如果完整 Navigation SDK UI 不適用於您要建立的體驗 (例如 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
類別的 Message.what 欄位識別,該欄位會設為 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
狀態表示導覽功能已啟用,使用者正在行駛提供的路線。可查看目前/即將進行的動作步驟相關資訊。重新規劃路線 -
REROUTING
表示導航正在進行中,但導航器正在尋找新路線。系統尚未規劃新路線,因此無法提供下一個動作步驟。在範例應用程式中,導覽資訊顯示畫面會顯示「重新規劃路線中...」訊息。找到路線後,系統會傳送NavInfo
訊息,並顯示ENROUTE
狀態。已停止 -
STOPPED
表示導航已結束。舉例來說,使用者在應用程式中結束導航時,導航就會停止。在範例應用程式中,STOPPED
狀態會清除導航資訊顯示畫面,避免顯示未結束的步驟說明。
填入動態消息顯示畫面
您已設定好逐步導覽服務,本節將說明可用於填入逐步導覽動態消息指引資訊卡的視覺和文字元素。
導覽資訊卡資訊欄位
使用者進入導覽模式後,頂端會顯示導覽資訊卡,其中包含從 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 會偵測左側或右側車流是否出現動作,並輸出適當的動作。因此,順時針和逆時針操作的手勢圖示可能會有所不同。
展開即可查看不同動作的範例圖示
範例圖示 | 逐向操作 |
---|---|
![]() |
DEPART UNKNOWN |
![]() |
STRAIGHT ON_RAMP_UNSPECIFIED OFF_RAMP_UNSPECIFIED NAME_CHANGE
|
![]() |
TURN_RIGHT ON_RAMP_RIGHT
|
![]() |
TURN_LEFT ON_RAMP_LEFT
|
![]() |
TURN_SLIGHT_RIGHT ON_RAMP_SLIGHT_RIGHT OFF_RAMP_SLIGHT_RIGHT
|
![]() |
TURN_SLIGHT_LEFT ON_RAMP_SLIGHT_LEFT OFF_RAMP_SLIGHT_LEFT
|
![]() |
TURN_SHARP_RIGHT ON_RAMP_SHARP_RIGHT OFF_RAMP_SHARP_RIGHT
|
![]() |
TURN_SHARP_LEFT ON_RAMP_SHARP_LEFT OFF_RAMP_SHARP_LEFT
|
![]() |
TURN_U_TURN_COUNTERCLOCKWISE ON_RAMP_U_TURN_COUNTERCLOCKWISE OFF_RAMP_U_TURN_COUNTERCLOCKWISE
|
![]() |
TURN_U_TURN_CLOCKWISE ON_RAMP_U_TURN_CLOCKWISE OFF_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_RIGHT OFF_RAMP_RIGHT
|
![]() |
MERGE_LEFT OFF_RAMP_LEFT
|
![]() |
FORK_RIGHT TURN_KEEP_RIGHT ON_RAMP_KEEP_RIGHT OFF_RAMP_KEEP_RIGHT
|
![]() |
FORK_LEFT TURN_KEEP_LEFT ON_RAMP_KEEP_LEFT OFF_RAMP_KEEP_LEFT
|
![]() |
MERGE_UNSPECIFIED
|
![]() |
DESTINATION
|
![]() |
DESTINATION_RIGHT
|
![]() |
DESTINATION_LEFT
|
![]() |
FERRY_BOAT
|
![]() |
FERRY_TRAIN
|
使用生成的圖示
為方便使用 Android Auto,Navigation SDK 支援生成操作和車道指引圖示。這些圖示符合 Android Auto 車輛應用程式庫的圖片大小指引,建議以 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 應用程式: