פיד נתונים של מסלול מפורט מספק מידע לניווט בלבד למכשירים שלא מיועדים להנחיות ניווט מבוססות-מפה. הוא מספק תמרונים קרובים עם רכיבים שאתם מספקים:
- סמלים (שמאלה, ימינה, פרסה)
- מספרים בכיכרות
- שמות של כבישים
- מרחקים משוערים וזמן עד לשלב הבא בניווט או ליעד הסופי
אתם יכולים להשתמש בפיד של מסלול מפורט כדי ליצור חוויות שבהן ממשק המשתמש המלא של 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 |
|---|---|
![]() |
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:







































