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

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

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

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

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