在 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()
  }
}

更新行程進度

如要更新行程進度詳細資料,例如車輛所需的距離 抵達目的地及預計到達時間時,您的應用程式必須 註冊及設定事件監聽器,如以下範例所示。

  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)
    

停止追蹤行程

請確保應用程式不再需要特定行程,因此必須停止追蹤,例如: 就像駕駛人在後端將行程標示為 COMPLETE 時。停止歷程 共用功能可避免對 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 RPC 說明
400 INVALID_ARGUMENT 用戶端指定的行程名稱無效。行程名稱必須遵循 格式:providers/{provider_id}/trips/{trip_id}provider_id 必須是 連線服務供應商
401 未驗證 如果沒有有效的驗證憑證,便會收到這則錯誤訊息。 舉例來說,如果簽署 JWT 權杖時不含行程 ID 或 JWT 權杖, 已過期。
403 PERMISSION_DENIED 如果用戶端沒有足夠的權限,就會收到這個錯誤 (例如,具備消費者角色的使用者嘗試呼叫 updateTrip), JWT 權杖無效,或是用戶端專案未啟用 API。 缺少 JWT 權杖,或是權杖簽署時使用的行程 ID 與要求的行程 ID 不符。
429 RESOURCE_EXHAUSTED 資源配額為 0,或流量速率超出上限。
503 無法使用 服務無法使用,通常是因伺服器停止運作所致。
504 DEADLINE_EXCEEDED 已超出要求期限。只有在呼叫端設定了 如果期限短於方法的預設期限 (即 要求的期限不足,伺服器無法處理要求) 要求未在期限內完成。

處理消費者 SDK 錯誤

Consumer SDK 利用回呼,將行程更新錯誤傳送至消費者應用程式 以注意力機制為基礎回呼參數是平台專屬的傳回類型 ( TripUpdateError 在 Android 裝置上,以及 NSError

擷取狀態碼

傳遞至回呼的錯誤通常是 gRPC 錯誤,您也可以 會以狀態碼的形式,從用戶端擷取額外資訊。對於 完整的狀態碼清單,請參閱 gRPC 中的狀態碼及其用途

Java

您可以擷取提供錯誤詳情的 gRPC 狀態碼 (來自 onTripUpdateError() 傳回的 TripUpdateError)。

// Called when there is a trip update error.
@Override
public void onTripUpdateError(TripInfo tripInfo, TripUpdateError error) {
  Status.Code code = error.getStatusCode();
}

Kotlin

您可以擷取提供錯誤詳情的 gRPC 狀態碼 (來自 onTripUpdateError() 傳回的 TripUpdateError)。

// 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 伺服器回應的時間過長。
無法使用 伺服器無法使用。這通常是由網路造成的 問題。

用戶端錯誤

下列狀態碼代表用戶端錯誤,您必須採取行動 解決問題。Consumer SDK 會繼續重試行程,直到您 必須等到您採取行動之後才能恢復分享歷程。

狀態碼說明
INVALID_ARGUMENT 消費者應用程式指定的行程名稱無效。行程名稱必須 請採用 providers/{provider_id}/trips/{trip_id} 格式。
NOT_FOUND 這個行程從未建立。
PERMISSION_DENIED 消費者應用程式權限不足。發生這個錯誤的原因包括:
  • 消費者應用程式沒有權限
  • Google Cloud 中的專案未啟用 Consumer SDK 控制台。
  • 缺少 JWT 權杖或權杖無效。
  • 簽署 JWT 權杖的行程 ID 與 。
RESOURCE_EXHAUSTED 資源配額為零或流量速率超過 速限。
未驗證 JWT 權杖無效,導致要求驗證失敗。這個 發生錯誤時,可能是因為在簽署 JWT 權杖時並未提供行程 ID;或 系統就會刪除金鑰