追蹤行程後,消費者應用程式會顯示 適合供消費者使用為此,您的應用程式必須啟動 追蹤行程、更新行程進度,以及在行程時停止追蹤 完成。
本文將說明這項程序的運作方式。
事前準備
確認以下項目已完成設定:
您的消費者應用程式的後端服務已設定完畢,您的服務也已就緒 以便比對消費者與車輛
您已為應用程式設定地圖。
開始追蹤行程
當後端伺服器將車輛和車輛配對時,請使用
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()
}
}
更新行程進度
如要更新行程進度詳細資料,例如車輛所需的距離 抵達目的地及預計到達時間時,您的應用程式必須 註冊及設定事件監聽器,如以下範例所示。
在
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)
停止追蹤行程
請確保應用程式不再需要特定行程,因此必須停止追蹤,例如: 就像駕駛人在後端將行程標示為 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 | 消費者應用程式權限不足。發生這個錯誤的原因包括:
|
RESOURCE_EXHAUSTED | 資源配額為零或流量速率超過 速限。 |
未驗證 | JWT 權杖無效,導致要求驗證失敗。這個 發生錯誤時,可能是因為在簽署 JWT 權杖時並未提供行程 ID;或 系統就會刪除金鑰 |