即時路線資料動態饋給會為非以地圖為導航指引設計的裝置提供僅限導航的資訊。它會使用您提供的元素提供即將執行的機動項目:
- 圖示 (左、右、迴轉)
- 圓環內的轉彎號誌
- 道路名稱
- 預估抵達下一個導航步驟或最終目的地的距離和時間
您可以使用即時路線饋給,在不適合使用完整 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
表示導航中,但導航器正在尋找新路線。由於目前還沒有新路線,因此無法顯示即將前往的路線步驟。在範例應用程式中,導航資訊顯示畫面會顯示「重新導航中...」訊息。找到路線後,系統會傳送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 會偵測左側或右側車流中是否發生變換動作,並輸出適當的變換動作。因此,如果是順時針或逆時針的機動,圖示可能會有所不同。
展開即可查看不同機動動作的圖示示例
範例圖示 | TurnByTurn 操控 |
---|---|
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 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 應用程式: