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