Ao acompanhar uma viagem, o aplicativo para o consumidor mostra a localização do veículo adequado ao consumidor. Para fazer isso, o app precisa começar a acompanhar uma viagem, atualizar o progresso dela e parar de acompanhar quando ela for concluída.
Este documento aborda como esse processo funciona.
Antes de começar
Confira se você configurou o seguinte:
Os serviços de back-end do aplicativo para o consumidor estão instalados, e os serviços para parear consumidores com veículos estão operacionais.
Você configurou um mapa para o app.
Começar a acompanhar uma viagem
Quando o servidor de back-end parear um consumidor com um veículo, use JourneySharingSession para começar a acompanhar a viagem.
O exemplo de código a seguir demonstra como começar a acompanhar uma viagem após o carregamento da visualização.
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()
}
}
Atualizar o progresso da viagem
Para atualizar os detalhes do progresso da viagem, como a distância que o veículo precisa percorrer antes da chegada e o horário previsto de chegada, o app precisa registrar e configurar um listener, conforme mostrado nos exemplos a seguir.
Registre um listener em um objeto
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?, ) { // ... } // ... })Configure o listener para sua viagem usando
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)
Parar de acompanhar uma viagem
Verifique se o app para de acompanhar uma viagem quando ela não é mais necessária, como quando a viagem é marcada como CONCLUÍDA no back-end pelo motorista. Parar o compartilhamento de viagens evita solicitações de rede desnecessárias para o Fleet Engine e impede vazamentos de memória.
Use JourneySharingSession para parar de acompanhar a viagem, conforme mostrado no exemplo de código a seguir.
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()
}
}
Processar erros de viagem
O método onTripRefreshError mostra erros que ocorrem durante o monitoramento da viagem. As mensagens de erro seguem o padrão de erros do Google Cloud. Para definições detalhadas de mensagens de erro
e todos os códigos de erro, consulte a documentação de erros do Google Cloud.
Confira alguns erros comuns que podem ocorrer durante o monitoramento da viagem:
| HTTP | RPC | Descrição |
|---|---|---|
| 400 | INVALID_ARGUMENT | O cliente especificou um nome de viagem inválido. O nome da viagem precisa seguir o
formato providers/{provider_id}/trips/{trip_id}. O
provider_id precisa ser o ID do projeto do Cloud de propriedade de
o provedor de serviços. |
| 401 | UNAUTHENTICATED | Você recebe esse erro se não houver credenciais de autenticação válidas. Por exemplo, se o token JWT for assinado sem um ID de viagem ou se o token JWT tiver expirado. |
| 403 | PERMISSION_DENIED | Você recebe esse erro se o cliente não tiver permissão suficiente (por exemplo, um usuário com a função de consumidor tenta chamar updateTrip), se o token JWT for inválido ou se a API não estiver ativada para o projeto do cliente. O token JWT pode estar ausente ou assinado com um ID de viagem que não corresponde ao ID de viagem solicitado. |
| 429 | RESOURCE_EXHAUSTED | A cota de recursos está em zero ou a taxa de tráfego excede o limite. |
| 503 | UNAVAILABLE | Serviço indisponível. Geralmente, o servidor está desativado. |
| 504 | DEADLINE_EXCEEDED | O prazo de solicitação foi excedido. Esse erro só ocorre se o autor da chamada definir um prazo menor que o prazo padrão do método (ou seja, o prazo solicitado não é suficiente para o servidor processar a solicitação) e a solicitação não terminar dentro do prazo. |
Processar erros do SDK do consumidor
O SDK do consumidor envia erros de atualização de viagem para o aplicativo para o consumidor usando um mecanismo de callback. O parâmetro de callback é um tipo de retorno específico da plataforma (
TripUpdateError
no Android e
NSError
no iOS).
Extrair códigos de status
Os erros transmitidos ao callback geralmente são erros de gRPC, e também é possível extrair mais informações deles na forma de um código de status. Para conferir a lista completa de códigos de status, consulte Códigos de status e uso no gRPC.
Java
É possível extrair um código de status do gRPC que fornece detalhes sobre o erro
do TripUpdateError retornado de onTripUpdateError().
// Called when there is a trip update error.
@Override
public void onTripUpdateError(TripInfo tripInfo, TripUpdateError error) {
Status.Code code = error.getStatusCode();
}
Kotlin
É possível extrair um código de status do gRPC que fornece detalhes sobre o erro
do TripUpdateError retornado de onTripUpdateError().
// Called when there is a trip update error.
override fun onTripUpdateError(tripInfo: TripInfo, error: TripUpdateError) {
val code = error.getStatusCode()
}
Interpretar códigos de status
Os códigos de status abrangem dois tipos de erros: erros relacionados ao servidor e à rede e erros do lado do cliente.
Erros de servidor e de rede
Os códigos de status a seguir são para erros de rede ou de servidor, e não é necessário tomar nenhuma ação para resolvê-los. O SDK do consumidor se recupera deles automaticamente.
| Código de status | Descrição |
|---|---|
| ABORTED | O servidor parou de enviar a resposta. Isso normalmente é causado por um problema no servidor. |
| CANCELLED | O servidor encerrou a resposta de saída. Isso normalmente
acontece quando
o aplicativo é enviado para o segundo plano ou quando há uma mudança de estado no aplicativo para o consumidor. |
| INTERRUPTED | |
| DEADLINE_EXCEEDED | O servidor demorou muito para responder. |
| UNAVAILABLE | O servidor estava indisponível. Isso normalmente é causado por um problema de rede. |
Erros do cliente
Os códigos de status a seguir são para erros do cliente, e você precisa tomar medidas para resolvê-los. O SDK do consumidor continua tentando atualizar a viagem até que você encerre o compartilhamento de viagens, mas ele não será recuperado até que você tome medidas.
| Código de status | Descrição |
|---|---|
| INVALID_ARGUMENT | O aplicativo para o consumidor especificou um nome de viagem inválido. O nome da viagem precisa
seguir o formato providers/{provider_id}/trips/{trip_id}.
|
| NOT_FOUND | A viagem nunca foi criada. |
| PERMISSION_DENIED | O aplicativo para o consumidor não tem permissões suficientes. Esse erro ocorre quando:
|
| RESOURCE_EXHAUSTED | A cota de recursos está em zero ou a taxa de fluxo de tráfego excede o limite de velocidade. |
| UNAUTHENTICATED | A solicitação falhou na autenticação devido a um token JWT inválido. Esse erro ocorre quando o token JWT é assinado sem um ID de viagem ou quando o token JWT expirou. |