Cuando sigues un viaje, tu app para consumidores muestra la ubicación de la vehículo apropiado para el consumidor. Para ello, tu app debe iniciarse seguir un viaje, actualizar el progreso del viaje y dejar de seguirlo cuando de datos completados.
En este documento, se explica cómo funciona ese proceso.
Antes de comenzar
Asegúrate de haber configurado lo siguiente:
Los servicios de backend de tu app para consumidores están implementados para conectar a los consumidores con vehículos.
Configuraste un mapa para tu app.
Comienza a seguir un viaje
Cuando tu servidor backend hace coincidir un consumidor con un vehículo, usa
JourneySharingSession
para comenzar a seguir el viaje usando el recorrido compartido.
El siguiente código de muestra demuestra cómo comenzar a compartir el recorrido después de la Ver cargas.
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()
}
}
Actualizar el progreso del viaje
Para actualizar los detalles del progreso del viaje, como la distancia que el vehículo debe viajar antes de la llegada y la hora estimada de llegada, tu app debe registra y configura un objeto de escucha como se muestra en los siguientes ejemplos.
Registra un objeto de escucha en un 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?, ) { // ... } // ... })
Configura el objeto de escucha del viaje con
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)
Cómo dejar de seguir un viaje
Asegúrate de que tu app se detenga después de un viaje cuando ya no sea necesaria. como cuando el conductor marca el viaje como COMPLETO en el backend. Deteniendo recorrido el uso compartido evita solicitudes de red innecesarias a Fleet Engine y evita fugas.
Usa JourneySharingSession
para dejar de seguir el viaje, como se muestra en el
siguiente código de muestra.
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()
}
}
Maneja errores de viajes
El método onTripRefreshError
muestra los errores que se producen durante el viaje.
y supervisión de los datos. Los mensajes de error siguen el estándar de Google Cloud Error. Para obtener información
las definiciones de mensajes de error y todos los códigos de error, consulta Errores de Google Cloud
documentación.
Estos son algunos errores comunes que pueden ocurrir durante la supervisión de viajes:
HTTP | RPC | Descripción |
---|---|---|
400 | INVALID_ARGUMENT | El cliente especificó un nombre de viaje no válido. El nombre del viaje debe seguir el
formato providers/{provider_id}/trips/{trip_id} . El
provider_id debe ser el ID del proyecto de Cloud que pertenece a
el proveedor de servicios. |
401 | UNAUTHENTICATED | Recibes este error si no hay credenciales de autenticación válidas. Por ejemplo, si el token JWT se firma sin un ID de viaje o el token JWT ha caducado. |
403 | PERMISSION_DENIED | Recibirás este error si el cliente no tiene los permisos necesarios (por ejemplo, un usuario con el rol de consumidor intenta llamar a updateTrip) si El token JWT no es válido o la API no está habilitada para el proyecto del cliente. Es posible que falte el token JWT o que el token esté firmado con un ID de viaje no coincide con el ID de viaje solicitado. |
429 | RESOURCE_EXHAUSTED | La cuota de recursos es de cero o la frecuencia de tráfico excede el límite. |
503 | NO DISPONIBLE | Servicio no disponible. Por lo general, el servidor no está en funcionamiento. |
504 | DEADLINE_EXCEEDED | Se excedió el plazo de la solicitud. Este error solo ocurre si el emisor establece un que sea menor que el plazo predeterminado del método (es decir, el el plazo solicitado no es suficiente para que el servidor procese la solicitud). la solicitud no finalizó dentro del plazo. |
Maneja errores de SDK de consumidor
El SDK del consumidor envía errores de actualizaciones de viaje a la app para consumidores mediante una devolución de llamada.
de atención. El parámetro de devolución de llamada es un tipo de datos que se devuelve en función de la plataforma (
TripUpdateError
en Android
NSError
en iOS).
Extrae códigos de estado
Los errores que se pasan a la devolución de llamada suelen ser errores de gRPC. También puedes y extraer información adicional en forma de código de estado. Para el una lista completa de los códigos de estado, consulta Códigos de estado y su uso en gRPC.
Java
Puedes extraer un código de estado de gRPC que proporcione detalles sobre el error.
del TripUpdateError
que muestra onTripUpdateError()
.
// Called when there is a trip update error.
@Override
public void onTripUpdateError(TripInfo tripInfo, TripUpdateError error) {
Status.Code code = error.getStatusCode();
}
Kotlin
Puedes extraer un código de estado de gRPC que proporcione detalles sobre el error.
del TripUpdateError
que muestra onTripUpdateError()
.
// Called when there is a trip update error.
override fun onTripUpdateError(tripInfo: TripInfo, error: TripUpdateError) {
val code = error.getStatusCode()
}
Cómo interpretar los códigos de estado
Los códigos de estado abarcan dos tipos de errores: errores relacionados con el servidor y la red. errores del cliente.
Errores de servidor y red
Los siguientes códigos de estado son para errores de red o de servidor, y no necesitan tomar medidas para resolverlos. El SDK de consumidor automáticamente se recupera de ellos.
Código de estado | Descripción |
---|---|
ABORTED | El servidor dejó de enviar la respuesta. Por lo general, esto se debe a un en el servidor. |
CANCELADO | El servidor finalizó la respuesta saliente. Normalmente,
ocurre cuando
la app se envía a segundo plano o cuando hay un cambio de estado en la App para consumidores |
/, interrumpido | |
DEADLINE_EXCEEDED | El servidor tardó demasiado en responder. |
NO DISPONIBLE | El servidor no estaba disponible. Por lo general, esto se debe a una red problema. |
Errores de cliente
Los siguientes códigos de estado son para errores de cliente; debes tomar medidas para y resolverlos. El SDK del consumidor continúa reintentando actualizar el viaje hasta que finalizas el recorrido, pero no se recuperará hasta que tomes medidas al respecto.
Código de estado | Descripción |
---|---|
INVALID_ARGUMENT | La app para consumidores especificó un nombre de viaje no válido. El nombre del viaje debe
sigue el formato providers/{provider_id}/trips/{trip_id} .
|
NOT_FOUND | El viaje nunca se creó. |
PERMISSION_DENIED | La app para consumidores no tiene permisos suficientes. Este error ocurre en las siguientes situaciones:
|
RESOURCE_EXHAUSTED | La cuota de recursos está en cero, o la frecuencia del flujo de tráfico supera el límite de velocidad. |
UNAUTHENTICATED | Falló la autenticación de la solicitud debido a un token JWT no válido. Esta ocurre cuando el token JWT se firma sin un ID de viaje o cuando el token JWT caduque. |