פיד נתונים של מסלול מפורט מספק מידע לניווט בלבד למכשירים שלא מיועדים להנחיות ניווט מבוססות-מפה. הוא מספק תמרונים קרובים עם רכיבים שאתם מספקים:
- סמלים (שמאלה, ימינה, פרסה)
- מספרים בפניות חדות
- שמות של כבישים
- מרחקים משוערים וזמן עד לשלב הבא בניווט או ליעד הסופי
אתם יכולים להשתמש בפיד של ההוראות המפורטות כדי ליצור חוויות שבהן ממשק המשתמש המלא של Navigation SDK לא מתאים, למשל ב-Android Auto או במסכים קטנים שבהם אין אפשרות להשתמש במערכת Android מלאה. לדוגמה, אפשר להשתמש בזה עבור נהגים של כלי רכב דו-גלגליים, שבהם אפשר להקרין הנחיות ניווט בלבד כדי לעזור להם להגיע ליעדים שלהם מהר יותר ובביטחון רב יותר, עם מינימום הסחות דעת.
כדי להשתמש ב-SDK, צריך ליצור שירות ולרשום אותו ב-Navigation SDK ל-Android כדי שיוכל לקבל מידע חדש על הניווט בזמן אמת (בערך פעם בשנייה במהלך הניווט).
במאמר הזה מוסבר איך ליצור ולרשום שירות ניווט שמקבל מידע על ניווט מ-SDK ומספק את מצב הניווט למכשיר המקבל.
סקירה כללית
בקטע הזה מופיע סיכום של התהליך הכללי להפעלת התכונה 'הוראות הגעה מפורטות'.
שימוש בתכונה 'מסלול מפורט'
אלה השלבים העיקריים להפעלת התכונה של הנחיות מפורטות. בקטעים הבאים מפורטים כל אחד מהשלבים.
יצירת שירות לקבלת עדכוני ניווט
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
מציין שהניווט המודרך פעיל והמשתמש נמצא במסלול שסופק. מידע על שלב התמרון הנוכחי או הבא זמין.ניתוב מחדש –
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}]
יצירת סמלים לתמרונים
ה-enum
Maneuver
מגדיר כל תמרון אפשרי שיכול להתרחש במהלך הניווט, ואפשר לקבל את התמרון עבור שלב נתון מהשיטה StepInfo.getManeuver()
.
צריך ליצור סמלים של תמרונים ולהתאים אותם לתמרונים הרלוונטיים.
בחלק מהתמרונים אפשר להגדיר מיפוי של אחד לאחד לסמל, כמו
DESTINATION_LEFT
ו-DESTINATION_RIGHT
. עם זאת, מכיוון שחלק מהתמרונים דומים, יכול להיות שתרצו למפות יותר מתמרון אחד לסמל יחיד. לדוגמה, TURN_LEFT
ו-ON_RAMP_LEFT
יכולים להיות ממופים לסמל של פנייה שמאלה.
חלק מהתמרונים מכילים תווית נוספת clockwise
או counterclockwise
, שה-SDK קובע על סמך צד הנהיגה במדינה. לדוגמה, במדינות שבהן נוהגים בצד שמאל של הכביש, הנהגים נכנסים לכיכר או מבצעים פניית פרסה בכיוון השעון, ואילו במדינות שבהן נוהגים בצד ימין של הכביש, הנהגים נכנסים לכיכר או מבצעים פניית פרסה נגד כיוון השעון. Navigation SDK מזהה אם התמרון מתרחש בתנועה בצד ימין או בצד שמאל, ומציג את התמרון המתאים. לכן, סמל התמרון עשוי להיות שונה אם התמרון הוא עם כיוון השעון או נגד כיוון השעון.
הרחבה להצגת דוגמאות לסמלים של תמרונים שונים
סמל לדוגמה | TurnByTurn Maneuvers |
---|---|
![]() |
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, שבה מומלץ לטרגט תיבת תוחמת בגודל 500x74dp. פרטים נוספים זמינים במאמרי העזרה של 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: