乗車を追跡すると、適切な車両の位置情報がユーザー向けアプリに表示されます。そのため、アプリは乗車を追跡し、乗車の進行状況を更新し、乗車が完了したら追跡を停止する必要があります。
このドキュメントでは、そのプロセスの仕組みについて説明します。
始める前に
次の項目が設定されていることを確認します。
ユーザーアプリのバックエンド サービスが整備され、コンシューマーと車両をマッチングするサービスが運用されている。
アプリの地図を設定している。
トリップのフォローを開始する
バックエンド サーバーがコンシューマーと車両を照合したら、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)
トリップのフォローを停止する
アプリが、不要になったときに乗車ルートの追跡を停止するようにします。たとえば、乗車がバックエンドで運転手によって完了とマークされた場合などです。ジャーニーの共有を停止すると、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 エラーのドキュメントをご覧ください。
トリップのモニタリングで発生する一般的なエラーをいくつかご紹介します。
| HTTP | RPC | 説明 |
|---|---|---|
| 400 | INVALID_ARGUMENT | クライアントが無効な旅行名を指定しました。旅行名は providers/{provider_id}/trips/{trip_id} の形式にする必要があります。provider_id は、サービス提供者が所有する Cloud プロジェクトの ID である必要があります。 |
| 401 | UNAUTHENTICATED | 有効な認証情報がない場合に、このエラーが発生します。たとえば、乗車 ID なしで JWT トークンが署名されている場合や、JWT トークンの有効期限が切れている場合などです。 |
| 403 | PERMISSION_DENIED | このエラーは、クライアントに十分な権限がない場合(コンシューマー ロールのユーザーが updateTrip を呼び出そうとした場合など)、JWT トークンが無効な場合、またはクライアント プロジェクトで API が有効になっていない場合に発生します。JWT トークンがないか、リクエストされた乗車 ID と一致しない乗車 ID でトークンが署名されている可能性があります。 |
| 429 | RESOURCE_EXHAUSTED | リソース割り当てがゼロであるか、トラフィックのレートが上限を超えています。 |
| 503 | UNAVAILABLE | サービス利用不可。通常、サーバーがダウンしています。 |
| 504 | DEADLINE_EXCEEDED | リクエスト期限を超えました。このエラーは、呼び出し元がメソッドのデフォルトの期限よりも短い期限を設定し(つまり、リクエストされた期限がサーバーでリクエストを処理するのに十分でない)、リクエストが期限内に完了しなかった場合にのみ発生します。 |
Consumer SDK エラーを処理する
Consumer SDK は、コールバック メカニズムを使用して、乗車情報の更新エラーをコンシューマー アプリに送信します。コールバック パラメータはプラットフォーム固有の戻り値の型(Android では TripUpdateError、iOS では NSError)です。
ステータス コードを抽出する
コールバックに渡されるエラーは通常 gRPC エラーです。ステータス コードの形式で追加情報を抽出することもできます。ステータス コードの完全なリストについては、ステータス コードと gRPC での使用をご覧ください。
Java
onTripUpdateError() から返された TripUpdateError から、エラーの詳細を提供する gRPC ステータス コードを抽出できます。
// Called when there is a trip update error.
@Override
public void onTripUpdateError(TripInfo tripInfo, TripUpdateError error) {
Status.Code code = error.getStatusCode();
}
Kotlin
onTripUpdateError() から返された TripUpdateError から、エラーの詳細を提供する gRPC ステータス コードを抽出できます。
// Called when there is a trip update error.
override fun onTripUpdateError(tripInfo: TripInfo, error: TripUpdateError) {
val code = error.getStatusCode()
}
ステータス コードを解釈する
ステータス コードは、サーバーとネットワーク関連のエラー、クライアントサイドのエラーの 2 種類のエラーを対象としています。
サーバー エラーとネットワーク エラー
次のステータス コードはネットワーク エラーまたはサーバーエラーを示しており、解決するために対応する必要はありません。Consumer SDK は自動的に復元します。
| ステータス コード | 説明 |
|---|---|
| ABORTED | サーバーがレスポンスの送信を停止しました。通常、これはサーバーの問題が原因です。 |
| CANCELLED | サーバーが送信レスポンスを終了しました。通常、これは アプリがバックグラウンドに送られた場合や、 ユーザーアプリの状態が変化した場合に発生します。 |
| INTERRUPTED | |
| DEADLINE_EXCEEDED | サーバーの応答に時間がかかりすぎました。 |
| UNAVAILABLE | サーバーが利用できませんでした。通常、これはネットワークの問題が原因で発生します。 |
クライアントエラー
次のステータス コードはクライアント エラーを示しており、解決するには対応が必要です。Consumer SDK は、乗車情報の共有を終了するまで乗車情報の更新を再試行し続けますが、ユーザーが操作するまで復元されません。
| ステータス コード | 説明 |
|---|---|
| INVALID_ARGUMENT | Consumer アプリで無効な乗車名を指定しました。乗車名は providers/{provider_id}/trips/{trip_id} の形式に従う必要があります。 |
| NOT_FOUND | ルートが作成されなかった。 |
| PERMISSION_DENIED | ユーザーアプリに十分な権限がありません。このエラーは、次の場合に発生します。
|
| RESOURCE_EXHAUSTED | リソース割り当てがゼロであるか、トラフィック フローのレートが制限速度を超えている。 |
| UNAUTHENTICATED | JWT トークンが無効なため、リクエストの認証に失敗しました。このエラーは、JWT トークンが乗車 ID なしで署名された場合、または JWT トークンの有効期限が切れた場合に発生します。 |