הפעלת פיד נתונים מפורט

פיד נתונים של מסלול מפורט מספק מידע לניווט בלבד למכשירים שלא מיועדים להנחיות ניווט מבוססות-מפה. הוא מספק תמרונים קרובים עם רכיבים שאתם מספקים:

  • סמלים (שמאלה, ימינה, פרסה)
  • מספרים בכיכרות
  • שמות של כבישים
  • מרחקים משוערים וזמן עד לשלב הבא בניווט או ליעד הסופי

אתם יכולים להשתמש בפיד של מסלול מפורט כדי ליצור חוויות שבהן ממשק המשתמש המלא של Navigation SDK לא מתאים, למשל ל-Android Auto או למסכים קטנים שבהם אין גישה לסט מלא של Android. לדוגמה, אפשר להשתמש בזה עבור נהגים של רכבים דו-גלגליים, שבהם אפשר להקרין הנחיות ניווט בלבד כדי לעזור להם להגיע ליעדים שלהם מהר יותר ובביטחון רב יותר, עם מינימום הסחות דעת.

כדי להשתמש ב-SDK, צריך ליצור שירות ולרשום אותו ב-Navigation SDK ל-Android כדי שהוא יוכל לקבל מידע חדש על הניווט בזמן אמת (בערך פעם בשנייה במהלך הניווט).

במאמר הזה מוסבר איך ליצור ולרשום שירות ניווט שמקבל מידע על ניווט מ-SDK ומספק את מצב הניווט למכשיר המקבל.

סקירה כללית

בקטע הזה מופיע סיכום של התהליך הכללי להפעלת התכונה של מסלול מפורט.

שימוש בתכונה 'הוראות הגעה מפורטות'

אלה השלבים העיקריים להפעלת התכונה של מסלול מפורט. בקטעים הבאים מפורט כל שלב.

  1. איך יוצרים שירות לקבלת עדכונים על ניווט

  2. רישום השירות.

  3. הסבר על מצבי הניווט

יצירת שירות לקבלת עדכוני ניווט

‫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 מוחק את התצוגה של פרטי הניווט כדי למנוע הצגה של הוראות מפורטות שנשארו מהניווט.

איך מאכלסים את תצוגת הפיד

אחרי שמגדירים את שירות המסלול המפורט, בקטע הזה מוסבר על הרכיבים החזותיים והטקסטואליים שאפשר להשתמש בהם כדי למלא את כרטיסי ההנחיות בפיד המסלול המפורט.

מסך של טלפון נייד שמוצג בו פנייה שמאלה קרובה בעוד 100 רגל אל W Ahwanee Ave. בתחתית המסך, הזמן שנותר עד ליעד הוא 46 דקות, והמרחק שנותר הוא 39 מיילים.

כשמשתמש נכנס לניווט מודרך, כרטיס ניווט מופיע בחלק העליון, עם נתוני ניווט שמגיעים מ-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

שימוש בסמלים שנוצרו

רשימה קטנה של סמלים שנוצרו על ידי Navigation SDK.

כדי לתמוך בתרחישי שימוש ב-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 בסמלים.

המאמרים הבאים