כשאתם עוקבים אחרי נסיעה, המיקום של הרכב המתאים מוצג באפליקציה של הצרכן. כדי לעשות זאת, האפליקציה צריכה להתחיל לעקוב אחרי נסיעה, לעדכן את ההתקדמות שלה ולהפסיק לעקוב אחריה כשהיא מסתיימת.
במסמך הזה נסביר איך התהליך הזה עובד.
לפני שמתחילים
ודאו שהגדרתם את הפריטים הבאים:
שירותי הקצה העורפי של אפליקציית הצרכן מופעלים, ושירותי ההתאמה של צרכנים לכלי רכב פועלים.
הגדרתם מפה לאפליקציה.
התחלת מעקב אחרי נסיעה
כששרת הקצה העורפי מתאים בין צרכן לרכב, משתמשים ב-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()
}
}
עדכון ההתקדמות בנסיעה
כדי לעדכן את פרטי ההתקדמות של הנסיעה, כמו המרחק שנותר לרכב לנסוע עד להגעה והשעה המשוערת של ההגעה, האפליקציה צריכה לרשום ולקבוע מאזין, כפי שמתואר בדוגמאות הבאות.
רישום של מעבד אירועים באובייקט
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?, ) { // ... } // ... })
מגדירים את המאזין לנסיעה באמצעות
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.
ריכזנו כאן כמה שגיאות נפוצות שעשויות להתרחש במהלך מעקב אחר נסיעות:
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 | המועד האחרון לשליחת הבקשה חלף. השגיאה הזו מתרחשת רק אם מבצע הקריאה מגדיר מועד יעד קצר יותר ממועד היעד שמוגדר כברירת מחדל ל-method (כלומר, מועד היעד המבוקש לא מספיק לשרת כדי לעבד את הבקשה) והבקשה לא הושלמה עד למועד היעד. |
טיפול בשגיאות ב-SDK של הצרכן
ה-Consumer 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()
}
הסבר על קודי הסטטוס
קודי הסטטוס כוללים שני סוגים של שגיאות: שגיאות שקשורות לשרת ולרשת, ושגיאות בצד הלקוח.
שגיאות שרת ורשת
קודי הסטטוס הבאים הם של שגיאות ברשת או בשרת, ואין צורך לבצע פעולה כלשהי כדי לפתור אותן. ה-Consumer SDK מתאושש מהן באופן אוטומטי.
קוד הסטטוס | תיאור |
---|---|
ABORTED | השרת הפסיק לשלוח את התגובה. בדרך כלל הסיבה לכך היא בעיה בשרת. |
בוטלה | השרת סיים את התגובה היוצאת. זה קורה בדרך כלל כשהאפליקציה של מועברת לרקע, או כשיש שינוי מצב באפליקציית הצרכן של . |
INTERRUPTED | |
DEADLINE_EXCEEDED | השרת הגיב באיחור רב מדי. |
UNAVAILABLE | השרת לא היה זמין. בדרך כלל הבעיה הזו נובעת מבעיה ברשת. |
שגיאות לקוח
קודי הסטטוס הבאים הם של שגיאות בצד הלקוח, וצריך לבצע פעולה כדי לפתור אותן. ערכת ה-SDK של הצרכן תמשיך לנסות לרענן את הנסיעה עד שתסיימו את שיתוף המסלול, אבל היא לא תתאושש עד שתבצעו פעולה כלשהי.
קוד הסטטוס | תיאור |
---|---|
INVALID_ARGUMENT | שם הנסיעה שצוין באפליקציית הצרכן לא חוקי. שם הנסיעה חייב להיות בפורמט providers/{provider_id}/trips/{trip_id} .
|
NOT_FOUND | הנסיעה לא נוצרה אף פעם. |
PERMISSION_DENIED | לאפליקציית הצרכן אין מספיק הרשאות. השגיאה הזו מתרחשת במקרים הבאים:
|
RESOURCE_EXHAUSTED | מכסת המשאבים היא אפס, או שרמת התנועה חורגת מהמהירות המותרת. |
UNAUTHENTICATED | הבקשה נכשלה באימות בגלל טוקן JWT לא חוקי. השגיאה הזו מתקבלת כשאסימון ה-JWT נחתם ללא מזהה נסיעה, או כשפג תוקף האסימון. |