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