即時路線資料動態饋給會向不支援地圖導航的裝置,提供僅限導航的資訊。這項功能會根據您提供的元素,提供即將進行的動作:
- 圖示 (左轉、右轉、迴轉)
- 圓環出口編號
- 道路名稱
- 到下一個導航步驟或最終目的地的預估距離和時間
您可以使用即時路線動態消息,在不適合使用完整 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:
ENROUTE狀態表示引導式導航功能已啟用,且使用者正在行經提供的路線。可取得目前即將進行的行進步驟相關資訊。重新規劃路線 -
REROUTING表示導航正在進行中,但導航器正在尋找新路線。由於尚未有新路線,因此無法提供下一個行進步驟。在範例應用程式中,導航資訊畫面會顯示「重新規劃路線...」訊息。找到路徑後,系統會傳送狀態為ENROUTE的NavInfo訊息。Stopped -
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 會偵測行車方向是靠左或靠右,並輸出適當的行車方向。因此,順時針和逆時針操作的圖示可能不同。
展開即可查看不同動作的範例圖示
| 範例圖示 | TurnByTurn Maneuvers |
|---|---|
![]() |
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 車用應用程式庫的圖片大小指南,建議指定 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 應用程式:







































