מעקב אחר נסיעה ב-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()
  }
}

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

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

  1. רישום של מעבד אירועים באובייקט 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 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 לאפליקציית הצרכן אין מספיק הרשאות. השגיאה הזו מתרחשת כאשר:
  • לאפליקציה של הצרכן אין הרשאות
  • ערכת ה-SDK לצרכנים לא מופעלת עבור הפרויקט ב-Google Cloud מסוף.
  • טוקן ה-JWT חסר או לא תקין.
  • אסימון ה-JWT חתום עם מזהה נסיעה שאינו תואם בקשת הנסיעה.
RESOURCE_EXHAUSTED מכסת המשאבים היא אפס, או שקצב זרימת התנועה חורג מגבלת מהירות.
UNAUTHENTICATED האימות של הבקשה נכשל כי אסימון JWT לא תקין. הזה כאשר אסימון ה-JWT חתום ללא מזהה נסיעה, או כשפג התוקף של אסימון ה-JWT.