כשעוקבים אחרי נסיעה, האפליקציה לצרכנים מציגה את המיקום של את הרכב המתאים לצרכן. כדי לעשות זאת, האפליקציה צריכה להפעיל את לעקוב אחרי נסיעה, לעדכן את ההתקדמות בנסיעה ולהפסיק את המעקב אחרי נסיעה שהושלמו.
במסמך הזה מוסבר איך התהליך הזה עובד.
לפני שמתחילים
חשוב לוודא שהגדרתם את הפריטים הבאים:
השירותים לקצה העורפי של האפליקציה לצרכנים קיימים והשירותים שלך לצורך התאמה לצרכנים עם כלי רכב, פעיל.
הגדרתם מפה עבור האפליקציה.
התחלת מעקב אחר נסיעה
כששרת הקצה העורפי מתאים בין צרכן לבין רכב, השתמשו
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()
}
}
עדכון ההתקדמות בנסיעה
כדי לעדכן את פרטי ההתקדמות בנסיעה, כמו המרחק שהרכב צריך באפליקציה לפני ההגעה וזמן ההגעה המשוער, האפליקציה צריכה רישום והגדרה של listener כפי שמוצג בדוגמאות הבאות.
רישום 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?, ) { // ... } // ... })
הגדרת המאזינים לנסיעה באמצעות
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 errors
תיעוד.
ריכזנו כאן כמה שגיאות נפוצות שעשויות להתרחש במהלך מעקב אחרי נסיעות:
HTTP | הכנסה לקליק | תיאור |
---|---|---|
400 | INVALID_ARGUMENT | הלקוח ציין שם נסיעה לא חוקי. שם הנסיעה חייב להופיע אחרי המחרוזת.
פורמט providers/{provider_id}/trips/{trip_id} .
provider_id חייב להיות המזהה של הפרויקט בענן שבבעלות
ספק השירות. |
401 | לא מאומת | השגיאה הזו תופיע אם אין פרטי כניסה תקינים לאימות. לדוגמה, אם אסימון ה-JWT חתום ללא מזהה נסיעה או אסימון ה-JWT פג תוקף. |
403 | PERMISSION_DENIED | השגיאה הזו מתקבלת אם ללקוח אין הרשאה מספקת (למשל, משתמש בתפקיד צרכן מנסה לקרוא ל-updateTrip), אם אסימון ה-JWT לא חוקי, או שה-API לא הופעל עבור פרויקט הלקוח. יכול להיות שאסימון ה-JWT חסר או שהוא חתום עם מזהה נסיעה לא תואם למזהה הנסיעה המבוקש. |
429 | RESOURCE_EXHAUSTED | מכסת המשאבים היא אפס או שקצב התנועה חורג מהמגבלה. |
503 | UNAVAILABLE | השירות לא זמין. בדרך כלל השרת מושבת. |
504 | DEADLINE_EXCEEDED | המועד האחרון של הבקשה עבר. השגיאה הזו מתרחשת רק אם המתקשר מגדיר שהוא קצר יותר מהמועד האחרון שנקבע כברירת מחדל לשיטה (כלומר, המועד האחרון המבוקש אינו מספיק כדי שהשרת יוכל לעבד את הבקשה) הבקשה לא הסתיימה במסגרת המועד האחרון. |
טיפול בשגיאות SDK של צרכנים
ה-SDK לצרכנים שולח שגיאות בעדכון הנסיעה לאפליקציה לצרכנים באמצעות קריאה חוזרת (callback)
על מנגנוני תשומת לב. פרמטר הקריאה החוזרת (callback) הוא סוג החזרה ספציפי לפלטפורמה (
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 באופן אוטומטי מתאושש מהם.
קוד סטטוס | תיאור |
---|---|
בוצעה הפרה | השרת הפסיק לשלוח את התגובה. בדרך כלל הדבר נגרם על ידי בעיה בשרת. |
בוטלה | השרת סיים את התגובה היוצאת. זה בדרך כלל
קורה כאשר
האפליקציה נשלחת לרקע, או כאשר חל שינוי במצב אפליקציה לצרכן. |
הפרעה | |
DEADLINE_EXCEEDED | לשרת נדרש זמן רב מדי להגיב. |
UNAVAILABLE | השרת לא היה זמין. בדרך כלל הסיבה לכך היא רשת . |
שגיאות לקוח
קודי הסטטוס הבאים מיועדים לשגיאות לקוח, ועליך לנקוט פעולה כדי לפתור אותן. ה-SDK של הצרכן ממשיך לנסות לרענן את הנסיעה עד לסיים את השיתוף של התהליך, אבל הוא לא ישוחזר עד שתנקטו פעולה.
קוד סטטוס | תיאור |
---|---|
INVALID_ARGUMENT | באפליקציה לצרכנים צוין שם נסיעה לא תקין. שם הנסיעה צריך להיות
בפורמט providers/{provider_id}/trips/{trip_id} .
|
NOT_FOUND | הנסיעה מעולם לא נוצרה. |
PERMISSION_DENIED | לאפליקציה לצרכנים אין הרשאות מספיקות. השגיאה הזו מתרחשת כאשר:
|
RESOURCE_EXHAUSTED | מכסת המשאבים היא אפס, או שקצב זרימת התנועה חורג מגבלת מהירות. |
לא מאומת | האימות של הבקשה נכשל כי אסימון JWT לא תקין. הזה כאשר אסימון ה-JWT חתום ללא מזהה נסיעה, או כשפג התוקף של אסימון ה-JWT. |