מעקב אחר נסיעה ב-Android

בחירת פלטפורמה: Android iOS JavaScript

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

במסמך הזה מוסבר איך התהליך הזה עובד.

לפני שמתחילים

ודאו שהגדרתם את הפריטים הבאים:

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

  • הגדרתם מפה לאפליקציה.

התחלת מעקב אחר נסיעה

כששרת הקצה העורפי מתאים בין צרכן לרכב, משתמשים ב-JourneySharingSession כדי להתחיל לעקוב אחרי הנסיעה.

הקוד לדוגמה הבא מדגים איך מתחילים לעקוב אחרי נסיעה אחרי שהתצוגה נטענת.

Java

public class MainActivity extends AppCompatActivity
    implements ConsumerViewModel.JourneySharingListener  {

  // Class implementation

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Create a TripModel instance to listen for updates to the trip specified by this trip name.
    String tripName = ...;
    TripModelManager tripModelManager = consumerApi.getTripModelManager();
    TripModel tripModel = tripModelManager.getTripModel(tripName);

    // Create a JourneySharingSession instance based on the TripModel.
    JourneySharingSession session = JourneySharingSession.createInstance(tripModel);

    // Add the JourneySharingSession instance on the map for updating the UI.
    consumerController.showSession(session);

    // Register for trip update events.
    tripModel.registerTripCallback(new TripModelCallback() {
      @Override
      public void onTripETAToNextWaypointUpdated(
          TripInfo tripInfo, @Nullable Long timestampMillis) {
        // ...
      }

      @Override
      public void onTripActiveRouteRemainingDistanceUpdated(
          TripInfo tripInfo, @Nullable Integer distanceMeters) {
        // ...
      }

      // ...
    });
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();

    if (journeySharingSession != null) {
      journeySharingSession.stop();
    }
  }
}

Kotlin

class SampleAppActivity : AppCompatActivity(), ConsumerViewModel.JourneySharingListener {

  // Class implementation

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    // Create a TripModel instance to listen for updates to the trip specified by this trip name.
    val tripName = "tripName"
    val tripModelManager = consumerApi.getTripModelManager()
    val tripModel = tripModelManager.getTripModel(tripName)

    // Create a JourneySharingSession instance based on the TripModel.
    val session = JourneySharingSession.createInstance(tripModel)

    // Add the JourneySharingSession instance on the map for updating the UI.
    consumerController.showSession(session)

    // Register for trip update events.
    tripModel.registerTripCallback(
      object : TripModelCallback() {
        override fun onTripETAToNextWaypointUpdated(
          tripInfo: TripInfo,
          timestampMillis: Long?,
        ) {
          // ...
        }

        override fun onTripActiveRouteRemainingDistanceUpdated(
          tripInfo: TripInfo,
          distanceMeters: Int?,
        ) {
          // ...
        }

      // ...
    })
  }

  override fun onDestroy() {
    super.onDestroy()

    journeySharingSession?.stop()
  }
}

עדכון ההתקדמות בנסיעה

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

  1. רישום listener באובייקט TripModel.

    Java

    // Create a TripModel instance for listening to updates to the trip specified by this trip name.
    String tripName = ...;
    TripModelManager tripModelManager = consumerApi.getTripModelManager();
    TripModel tripModel = tripModelManager.getTripModel(tripName);
    
    // Create a JourneySharingSession instance based on the TripModel.
    JourneySharingSession session = JourneySharingSession.createInstance(tripModel);
    
    // Add the JourneySharingSession instance on the map for updating the UI.
    consumerController.showSession(session);
    
    // Register for trip update events.
    tripModel.registerTripCallback(new TripModelCallback() {
    @Override
    public void onTripETAToNextWaypointUpdated(
            TripInfo tripInfo, @Nullable Long timestampMillis) {
          // ...
    }
    
    @Override
    public void onTripActiveRouteRemainingDistanceUpdated(
            TripInfo tripInfo, @Nullable Integer distanceMeters) {
          // ...
    }
    
    // ...
    });
    

    Kotlin

    // Create a TripModel instance for listening to updates to the trip specified by this trip name.
    val tripName = "tripName"
    val tripModelManager = consumerApi.getTripModelManager()
    val tripModel = tripModelManager.getTripModel(tripName)
    
    // Create a JourneySharingSession instance based on the TripModel.
    val session = JourneySharingSession.createInstance(tripModel)
    
    // Add the JourneySharingSession instance on the map for updating the UI.
    consumerController.showSession(session)
    
    // Register for trip update events.
    tripModel.registerTripCallback(
      object : TripModelCallback() {
        override fun onTripETAToNextWaypointUpdated(
          tripInfo: TripInfo,
          timestampMillis: Long?,
        ) {
          // ...
        }
    
        override fun onTripActiveRouteRemainingDistanceUpdated(
          tripInfo: TripInfo,
          distanceMeters: Int?,
        ) {
          // ...
        }
    
      // ...
    })
    
  2. הגדרת המאזינים לנסיעה באמצעות TripModelOptions.

    Java

    // Set refresh interval to 2 seconds.
    TripModelOptions tripOptions =
          TripModelOptions.builder().setRefreshIntervalMillis(2000).build();
    tripModel.setTripModelOptions(tripOptions);
    

    Kotlin

    // Set refresh interval to 2 seconds.
    val tripOptions = TripModelOptions.builder().setRefreshIntervalMillis(2000).build()
    tripModel.setTripModelOptions(tripOptions)
    

הפסקת המעקב אחרי נסיעה

מוודאים שהאפליקציה מפסיקה לעקוב אחר נסיעה כשאין בה יותר צורך, למשל כשהנסיעה מסומנת כהושלמה בקצה העורפי על ידי הנהג. הפסקת שיתוף המסלול מונעת בקשות רשת מיותרות ל-Fleet Engine ומונעת דליפות זיכרון.

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

Java

public class MainActivity extends AppCompatActivity
    implements ConsumerViewModel.JourneySharingListener  {

  // Class implementation

  @Override
  protected void onDestroy() {
    super.onDestroy();

    if (journeySharingSession != null) {
      journeySharingSession.stop();
    }
  }
}

Kotlin

class SampleAppActivity : AppCompatActivity(), ConsumerViewModel.JourneySharingListener {

  // Class implementation

  override fun onDestroy() {
    super.onDestroy()

    journeySharingSession?.stop()
  }
}

טיפול בשגיאות בנסיעות

השיטה onTripRefreshError מציגה שגיאות שמתרחשות במהלך המעקב אחר נסיעות. הודעות השגיאה עומדות בתקן השגיאות של Google Cloud. להגדרות מפורטות של הודעות שגיאה ולכל קודי השגיאה, עיינו במסמכי העזרה של Google Cloud Error.

ריכזנו כאן כמה שגיאות נפוצות שעשויות להתרחש במהלך מעקב אחרי נסיעות:

HTTP הכנסה לקליק תיאור
400 INVALID_ARGUMENT הלקוח ציין שם נסיעה לא חוקי. שם הנסיעה צריך להיות בפורמט providers/{provider_id}/trips/{trip_id}. הערך של provider_id צריך להיות המזהה של פרויקט Cloud שבבעלות ספק השירות.
401 UNAUTHENTICATED השגיאה הזו מופיעה אם אין פרטי כניסה תקפים לאימות. לדוגמה, אם אסימון ה-JWT נחתם ללא מזהה נסיעה או אם התוקף של אסימון ה-JWT פג.
403 PERMISSION_DENIED השגיאה הזו מתקבלת אם ללקוח אין הרשאה מספקת (לדוגמה, משתמש בתפקיד צרכן מנסה לקרוא ל-updateTrip), אם אסימון ה-JWT לא תקין או אם ה-API לא מופעל בפרויקט הלקוח. יכול להיות שאסימון ה-JWT חסר או שהאסימון חתום על ידי מזהה נסיעה שלא תואם למזהה הנסיעה המבוקש.
429 RESOURCE_EXHAUSTED מכסת המשאבים היא אפס או ששיעור התנועה חורג מהמגבלה.
503 UNAVAILABLE השירות לא זמין. בדרך כלל השרת מושבת.
504 DEADLINE_EXCEEDED המועד האחרון של הבקשה עבר. השגיאה הזו מתקבלת רק אם מבצע הקריאה החוזרת מגדיר מועד אחרון שקצר מברירת המחדל של המועד האחרון שנקבע לשיטה (כלומר, המועד האחרון המבוקש לא מספיק כדי שהשרת יוכל לעבד את הבקשה), והבקשה לא הסתיימה במסגרת המועד האחרון.

טיפול בשגיאות SDK של צרכנים

ה-SDK לצרכנים שולח שגיאות בעדכון הנסיעה לאפליקציה לצרכנים באמצעות מנגנון קריאה חוזרת. פרמטר הקריאה החוזרת הוא סוג החזרה ספציפי לפלטפורמה (TripUpdateError ב-Android ו-NSError ב-iOS).

חילוץ קודי סטטוס

בדרך כלל השגיאות שמועברות להפעלה החוזרת הן שגיאות gRPC, ואפשר גם לחלץ מהן מידע נוסף בצורת קוד סטטוס. בקישור הבא תוכלו למצוא רשימה מלאה של קודי הסטטוס: קודי סטטוס והשימוש בהם ב-gRPC.

Java

אפשר לחלץ קוד סטטוס של gRPC שמספק פרטים על השגיאה מה-TripUpdateError שהוחזר מ-onTripUpdateError().

// Called when there is a trip update error.
@Override
public void onTripUpdateError(TripInfo tripInfo, TripUpdateError error) {
  Status.Code code = error.getStatusCode();
}

Kotlin

אפשר לחלץ קוד סטטוס של gRPC שמספק פרטים על השגיאה מה-TripUpdateError שהוחזר מ-onTripUpdateError().

// Called when there is a trip update error.
override fun onTripUpdateError(tripInfo: TripInfo, error: TripUpdateError) {
  val code = error.getStatusCode()
}

פירוש של קודי סטטוס

קודי הסטטוס כוללים שני סוגים של שגיאות: שגיאות שקשורות לשרת ולרשת, ושגיאות בצד הלקוח.

שגיאות בחיבור לשרת ולרשת

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

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

שגיאות לקוח

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

קוד סטטוסתיאור
INVALID_ARGUMENT אפליקציית הצרכן ציין שם נסיעה לא חוקי. שם הנסיעה חייב להופיע בפורמט providers/{provider_id}/trips/{trip_id}.
NOT_FOUND הנסיעה מעולם לא נוצרה.
PERMISSION_DENIED לאפליקציה לצרכנים אין הרשאות מספיקות. השגיאה הזו מתקבלת כאשר:
  • לאפליקציה של הצרכן אין הרשאות
  • ערכת ה-SDK של הצרכן לא מופעלת בפרויקט במסוף Google Cloud.
  • אסימון ה-JWT חסר או לא חוקי.
  • אסימון ה-JWT חתום על ידי מזהה נסיעה שלא תואם לנסיעה המבוקשת.
RESOURCE_EXHAUSTED מכסת המשאבים היא אפס, או שקצב זרימת התנועה חורג מהמהירות המותרת.
UNAUTHENTICATED הבקשה נכשלה באימות בגלל טוקן JWT לא חוקי. השגיאה הזו מתקבלת כשאסימון ה-JWT חתום ללא מזהה נסיעה, או כשפג התוקף של אסימון ה-JWT.