Requisitos mínimos del sistema
El dispositivo móvil debe ejecutar Android 6.0 (nivel de API 23) o una versión posterior.
Configuración de compilaciones y dependencias
Las versiones 4.99 y posteriores del SDK de Driver están disponibles en el repositorio de Maven de Google.
Gradle
Agrega lo siguiente a tu archivo build.gradle
:
repositories {
...
google()
}
Maven
Agrega lo siguiente a tu archivo pom.xml
:
<project>
...
<repositories>
<repository>
<id>google-maven-repository</id>
<url>https://maven.google.com</url>
</repository>
</repositories>
...
</project>
Configuración de proyectos
Para usar el SDK del controlador, tu app debe orientarse a minSdkVersion
23 o una versión posterior. Para obtener más información, consulta
Notas de la versión
Para ejecutar una app compilada con el SDK de Driver, el dispositivo Android debe tener Servicios de Google Play esté instalado.
Configura tu proyecto de desarrollo
Cómo configurar tu proyecto de desarrollo y obtener una clave de API para el proyecto en la consola de Google Cloud:
Crea una nueva consola de Google Cloud. proyecto o seleccionar uno existente, para su uso con el SDK de Driver. Espera unos minutos hasta que el proyecto nuevo se puede ver en la consola de Google Cloud.
Para ejecutar la app de demostración, tu proyecto debe tener acceso al SDK de Maps para Android. En la consola de Google Cloud, selecciona APIs y Servicios > Biblioteca y, luego, busca y habilita el SDK de Maps para Android
Para obtener una clave de API para el proyecto, selecciona APIs y Servicios > Credenciales > Crear credenciales > Clave de API Para más información sobre cómo obtener una clave de API, consulta Obtén una clave de API.
Agrega el SDK de Driver a tu app
El SDK de Driver está disponible en el repositorio de Maven de Google. El incluye los archivos del modelo de objetos del proyecto (.pom) del SDK y Javadocs. Para agregar el SDK del controlador a tu app, haz lo siguiente:
Agrega la siguiente dependencia a tu configuración de Gradle o Maven: reemplazando el marcador de posición
VERSION_NUMBER
por la versión seleccionada de el SDK de Driver.Gradle
Agrega lo siguiente a tu
build.gradle
:dependencies { ... implementation 'com.google.android.libraries.mapsplatform.transportation:transportation-driver:[VERSION_NUMBER]' }
Maven
Agrega lo siguiente a tu
pom.xml
:<dependencies> ... <dependency> <groupId>com.google.android.libraries.mapsplatform.transportation.driver</groupId> <artifactId>transportation-driver</artifactId> <version>[VERSION_NUMBER]</version> </dependency> </dependencies>
El SDK de Driver depende del SDK de Navigation. Esta dependencia se configura de tal manera de modo que, si se necesita una versión específica del SDK de Navigation, Se define de forma explícita en el archivo de configuración de compilación de la siguiente manera: omitir el bloque de código mencionado permitirá que el proyecto siempre descargue la versión más reciente del SDK de Navigation dentro de la versión de actualización principal. Ten en cuenta que los comportamientos combinados de las versiones más recientes del SDK de Driver y El SDK de Navigation se sometió a pruebas rigurosas antes de sus lanzamientos.
Organiza la configuración de dependencias del desarrollo y la versión los entornos de producción según corresponda.
Gradle
Agrega lo siguiente a tu
build.gradle
:dependencies { ... implementation 'com.google.android.libraries.navigation:navigation:5.0.0' }
Maven
Agrega lo siguiente a tu
pom.xml
:<dependencies> ... <dependency> <groupId>com.google.android.libraries.navigation</groupId> <artifactId>navigation</artifactId> <version>5.0.0</version> </dependency> </dependencies>
Agrega la clave de API a tu app
Una vez que hayas agregado el SDK del controlador a tu app, agrega la clave de API a tu app. Tú debe usar la clave de API del proyecto que obtuvo cuando configura tu proyecto de desarrollo.
En esta sección, se describe cómo almacenar tu clave de API para que pueda ser más segura.
a los que hace referencia tu app. No deberías incluir tu clave de API en tu versión
un sistema de control de calidad. Debe almacenarse en el archivo local.properties
, que se
ubicado en el directorio raíz de tu proyecto. Para obtener más información sobre el
local.properties
, consulta
Archivos de propiedades de Gradle.
Para agilizar esta tarea, usa el Complemento Secrets Gradle para Android. Sigue este procedimiento para instalar el complemento Secrets Gradle y almacenarlo de forma segura tu clave de API.
Abre el archivo
build.gradle
en el nivel raíz y agrega el siguiente código al Elementodependencies
enbuildscript
.Groovy
buildscript { dependencies { // ... classpath "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.0" } }
Kotlin
buildscript { dependencies { // ... classpath("com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.0") } }
Abre el archivo
build.gradle
a nivel de la app y agrega el siguiente código al elementoplugins
.Groovy
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
Kotlin
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
Abre el archivo
local.properties
en el directorio de nivel de proyecto y, luego, agrega el archivo siguiente código. Asegúrate de reemplazarYOUR_API_KEY
por tu clave de API.MAPS_API_KEY=YOUR_API_KEY
En tu archivo
AndroidManifest.xml
, ve acom.google.android.geo.API_KEY
. Luego, actualiza el atributoandroid:value
de la siguiente manera:<meta-data android:name="com.google.android.geo.API_KEY" android:value="${MAPS_API_KEY}" />
En el siguiente ejemplo, se muestra un manifiesto completo para una app de ejemplo:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.driverapidemo" >
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/_AppTheme" >
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="${MAPS_API_KEY}" />
<activity android:name=".MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Incluye las atribuciones requeridas en tu aplicación
Si usas el SDK del controlador en tu app, debes incluir texto de atribución y licencias de código abierto como parte de los avisos legales de tu app sección. Es mejor incluir las atribuciones como un elemento de menú independiente o como parte de un elemento de menú Acerca de.
La información sobre las licencias se encuentra en el archivo “third_party_licenses.txt”. archivo en el archivo AAR desarchivado.
Consulta https://developers.google.com/android/guides/opensource. sobre cómo incluir avisos de código abierto.
Dependencias
El SDK de Driver usa gRPC a para comunicarse con el servidor de Fleet Engine. Si aún no incorporas gRPC, quizás debas declarar las siguientes dependencias:
dependencies {
implementation 'io.grpc:grpc-android:1.12.0'
implementation 'io.grpc:grpc-okhttp:1.12.0'
}
Sin estas dependencias, el SDK del controlador podría experimenta errores durante el tiempo de ejecución mientras intenta comunicarse con el servidor de Fleet Engine.
Si usas ProGuard para lo siguiente: optimizar tus compilaciones, quizás debas agregar las siguientes líneas a tu ProGuard de Terraform:
-dontwarn com.google.**
-dontwarn io.grpc.**
-dontwarn okio.**
El nivel de API mínimo admitido es 23.
Inicializa el SDK
Se requiere un ID de proveedor (por lo general, el ID del proyecto de Google Cloud) para
inicializamos el objeto DriverContext
. Para obtener más detalles sobre cómo configurar
proyecto de Google Cloud, consulta
Autenticación y autorización.
Antes de usar el SDK del controlador, primero debes inicializar el SDK de Navigation. Cómo inicializar el SDK:
Obtén un objeto
Navigator
deNavigationApi
.NavigationApi.getNavigator( this, // Activity new NavigationApi.NavigatorListener() { @Override public void onNavigatorReady(Navigator navigator) { // Keep a reference to the Navigator (used to configure and start nav) this.navigator = navigator; } } );
Crea un objeto
DriverContext
y propaga los campos obligatorios.DriverContext driverContext = DriverContext.builder(application) .setProviderId(providerId) .setVehicleId(vehicleId) .setAuthTokenFactory(authTokenFactory) .setNavigator(navigator) .setRoadSnappedLocationProvider( NavigationApi.getRoadSnappedLocationProvider(application)) .build();
Usa el objeto
DriverContext
para inicializar*DriverApi
.DeliveryDriverApi driverApi = DeliveryDriverApi.createInstance(driverContext);
Obtén el
DeliveryVehicleReporter
del objeto de la API. (DeliveryVehicleReporter
extiendeNavigationVehicleReporter
).DeliveryVehicleReporter vehicleReporter = driverApi.getDeliveryVehicleReporter();
Autentica con AuthTokenFactory
Cuando el SDK de Driver genera actualizaciones de ubicación,
debe enviar estas actualizaciones
el servidor de Fleet Engine. Para autenticar estas solicitudes, el
El SDK del controlador llama a un elemento
instancia de AuthTokenFactory
.
La fábrica es responsable de generar tokens de autenticación en la ubicación
hora de actualización.
La forma exacta en que se generan los tokens es específica de la situación de cada desarrollador. Sin embargo, es probable que la implementación necesite hacer lo siguiente:
- recuperar un token de autenticación, posiblemente en formato JSON, desde un servidor HTTPS
- analizar y almacenar en caché el token
- actualiza el token cuando caduque
Para obtener más información sobre los tokens que espera el servidor de Fleet Engine, consulta Crear un token web JSON (JWT) para autorización.
A continuación, se muestra una implementación básica de un AuthTokenFactory
:
class JsonAuthTokenFactory implements AuthTokenFactory {
private String vehicleServiceToken; // initially null
private long expiryTimeMs = 0;
private String vehicleId;
// This method is called on a thread whose only responsibility is to send
// location updates. Blocking is OK, but just know that no location updates
// can occur until this method returns.
@Override
public String getToken(AuthTokenContext authTokenContext) {
String vehicleId = requireNonNull(context.getVehicleId());
if (System.currentTimeMillis() > expiryTimeMs || !vehicleId.equals(this.vehicleId)) {
// The token has expired, go get a new one.
fetchNewToken(vehicleId);
}
return vehicleServiceToken;
}
private void fetchNewToken(String vehicleId) {
String url = "https://yourauthserver.example/token/" + vehicleId;
try (Reader r = new InputStreamReader(new URL(url).openStream())) {
com.google.gson.JsonObject obj
= com.google.gson.JsonParser.parseReader(r).getAsJsonObject();
vehicleServiceToken = obj.get("VehicleServiceToken").getAsString();
expiryTimeMs = obj.get("TokenExpiryMs").getAsLong();
// The expiry time could be an hour from now, but just to try and avoid
// passing expired tokens, we subtract 10 minutes from that time.
expiryTimeMs -= 10 * 60 * 1000;
this.vehicleId = vehicleId;
} catch (IOException e) {
// It's OK to throw exceptions here. The StatusListener you passed to
// create the DriverContext class will be notified and passed along the failed
// update warning.
throw new RuntimeException("Could not get auth token", e);
}
}
}
Esta implementación en particular usa el cliente HTTP de Java integrado para recuperar un en formato JSON desde el servidor de autenticación del desarrollador. El token es guardados para volver a usarlos. El token se vuelve a recuperar si el token anterior se encuentra en el transcurso de 10 minutos de su hora de vencimiento.
Es posible que tu implementación realice acciones de manera diferente; por ejemplo, usa un subproceso en segundo plano. para actualizar tokens.
Las excepciones en AuthTokenFactory
se tratan como transitorias, a menos que ocurran
repetidamente. Después de varios intentos, el SDK del controlador
asume que el error es permanente y deja de intentar enviar actualizaciones.
Informes de estado y errores con StatusListener
Dado que el SDK del controlador realiza acciones en el
en segundo plano, usa StatusListener
para activar notificaciones cuando se cumplan ciertas
como errores, advertencias o mensajes de depuración. Los errores pueden ser
transitorios por naturaleza (como BACKEND_CONNECTIVITY_ERROR
) o pueden
provocar que las actualizaciones de ubicación se detengan de forma permanente (como VEHICLE_NOT_FOUND
,
que indica un error de configuración).
Proporcionas una implementación de StatusListener
opcional como la siguiente:
class MyStatusListener implements StatusListener {
/** Called when background status is updated, during actions such as location reporting. */
@Override
public void updateStatus(
StatusLevel statusLevel, StatusCode statusCode, String statusMsg) {
// Status handling stuff goes here.
// StatusLevel may be DEBUG, INFO, WARNING, or ERROR.
// StatusCode may be DEFAULT, UNKNOWN_ERROR, VEHICLE_NOT_FOUND,
// BACKEND_CONNECTIVITY_ERROR, or PERMISSION_DENIED.
}
}
Notas sobre SSL/TLS
A nivel interno, la implementación del SDK de Driver usa
SSL/TLS para comunicarse de forma segura con el servidor de Fleet Engine. Versiones anteriores
de Android (niveles de API 23 o
anterior) puede requerir un parche SecurityProvider
para comunicarse con el
servidor. Para obtener más información sobre cómo trabajar con SSL en Android, consulta
Proveedor de GMS de seguridad.
El artículo también incluye muestras de código para aplicar parches al proveedor de seguridad.
Cómo habilitar las actualizaciones de ubicación
Una vez que tengas una instancia de *VehicleReporter
, se habilitarán las actualizaciones de ubicación
sencillo:
DeliveryVehicleReporter reporter = ...;
reporter.enableLocationTracking();
Si es posible, las actualizaciones de ubicación se envían a intervalos regulares. Cada ubicación también indica que el vehículo está en línea.
De forma predeterminada, el intervalo del informe es de 10 segundos. Puedes cambiar los informes
intervalo con reporter.setLocationReportingInterval(long, TimeUnit)
. El
el intervalo de actualización mínimo admitido es de 5 segundos. Es posible que las actualizaciones más frecuentes
generan solicitudes y errores más lentos.
Cómo inhabilitar las actualizaciones de ubicación
Cuando termine el turno del conductor, podrás detener las actualizaciones de ubicación llamando
DeliveryVehicleReporter.disableLocationTracking
Casos de uso del modelo de confianza
En esta sección, se describe cómo usar el SDK de Driver para implementar casos de uso comunes. cuando uses el modelo de confianza.
Crea un vehículo
Puedes crear un vehículo desde el SDK de Driver.
Antes de crear un vehículo, asegúrate de inicializar la API de Delivery Driver El ID de vehículo se debe crear con el ID del proveedor y del vehículo usados durante la inicialización del SDK de Driver. Luego, crea el vehículo como se muestra. en el siguiente ejemplo:
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleManager vehicleManager = api.getDeliveryVehicleManager();
try {
DeliveryVehicle vehicle = vehicleManager.createVehicle().get();
// Handle CreateVehicleRequest DeliveryVehicle response.
} catch (Exception e) {
// Handle CreateVehicleRequest error.
}
Crear una tarea de retiro de envío
Puedes crear una tarea de retiro del envío desde el SDK del controlador.
Antes de crear una tarea, asegúrate de inicializar la API de Delivery Driver La tarea se debe crear con el ID de proveedor que se especifica en el SDK de Driver. de inicio. Luego, crea la tarea de retiro del envío como se muestra en el siguiente ejemplo. Para obtener información sobre los IDs de tareas, consulta Ejemplos de IDs de tareas.
static final String TASK_ID = "task-8241890"; // Avoid auto-incrementing IDs.
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryTaskManager taskManager = api.getDeliveryTaskManager();
CreateDeliveryTaskRequest request = CreateDeliveryTaskRequest.builder(TASK_ID)
.setPlannedWaypoint(Waypoint.builder().setLatLng(-6.195139, 106.820826).build())
.setTaskDurationSeconds(2 * 60)
.setParentId("my-tracking-id")
.setTaskType(TaskType.DELIVERY_PICKUP)
.build();
try {
DeliveryTask task = taskManager.createTask(request).get();
// Handle CreateTaskRequest DeliveryTask response.
} catch (Exception e) {
// Handle CreateTaskRequest error.
}
Crear una tarea de entrega de envíos
Puedes crear una tarea de entrega de envíos desde el SDK del controlador.
Antes de crear una tarea, asegúrate de inicializar la API de Delivery Driver Luego, crea la tarea de entrega de envíos como se muestra en el siguiente ejemplo. Para obtener información sobre los IDs de las tareas, consulta Ejemplos de ID de tarea.
static final String TASK_ID = "task-8241890"; // Avoid auto-incrementing IDs.
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryTaskManager taskManager = api.getDeliveryTaskManager();
CreateDeliveryTaskRequest request = CreateDeliveryTaskRequest.builder(TASK_ID)
.setPlannedWaypoint(Waypoint.builder().setLatLng(-6.195139, 106.820826).build())
.setTaskDurationSeconds(2 * 60)
.setParentId("my-tracking-id")
.setTaskType(TaskType.DELIVERY_DELIVERY)
.build();
try {
DeliveryTask task = taskManager.createTask(request).get();
// Handle CreateTaskRequest DeliveryTask response.
} catch (Exception e) {
// Handle CreateTaskRequest error.
}
Falta de disponibilidad programada
Puedes crear una tarea que indique la falta de disponibilidad (por ejemplo, para quiebres o recargas de combustible) del SDK del Driver. Una falta programada tarea no deben incluir un ID de seguimiento. De manera opcional, puedes proporcionar una ubicación.
Antes de crear una tarea, asegúrate de inicializar la API de Delivery Driver Luego, crea la tarea de falta de disponibilidad como se muestra en el siguiente ejemplo. Para obtener información sobre los IDs de las tareas, consulta Ejemplos de ID de tarea.
static final String TASK_ID = "task-8241890"; // Avoid auto-incrementing IDs.
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryTaskManager taskManager = api.getDeliveryTaskManager();
CreateDeliveryTaskRequest request = CreateDeliveryTaskRequest.builder(TASK_ID)
.setTaskDurationSeconds(2 * 60) // Duration or location (or both) must be provided for a BREAK task.
.setTaskType(TaskType.UNAVAILABLE)
.build();
try {
DeliveryTask task = taskManager.createTask(request).get();
// Handle CreateTaskRequest DeliveryTask response.
} catch (Exception e) {
// Handle CreateTaskRequest error.
}
Paradas programadas
Puedes crear una tarea de detención programada desde el SDK del controlador. Un programa de detener la tarea podría no incluir un ID de seguimiento.
Antes de crear una tarea, asegúrate de inicializar la API de Delivery Driver Luego, crea la tarea de detención programada como se muestra en el siguiente ejemplo. Para obtener información sobre los IDs de las tareas, consulta Ejemplos de ID de tarea.
static final String TASK_ID = "task-8241890"; // Avoid auto-incrementing IDs.
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryTaskManager taskManager = api.getDeliveryTaskManager();
CreateDeliveryTaskRequest request = CreateDeliveryTaskRequest.builder(TASK_ID)
.setPlannedWaypoint(Waypoint.builder().setLatLng(-6.195139, 106.820826).build())
.setTaskDurationSeconds(2 * 60)
.setTaskType(TaskType.DELIVERY_SCHEDULED_STOP)
.build();
try {
DeliveryTask task = taskManager.createTask(request).get();
// Handle CreateTaskRequest DeliveryTask response.
} catch (Exception e) {
// Handle CreateTaskRequest error.
}
Actualizar el orden de las tareas
Puedes actualizar el orden de ejecución de las tareas asignadas a un vehículo desde la SDK de Driver.
Actualizar el orden de las tareas también asigna tareas a un vehículo si no lo estaban asignados previamente a un vehículo. También cierra las tareas que anteriormente se se asignaron a un vehículo y quedaron fuera del pedido actualizado. La asignación de un tarea a un vehículo diferente si antes se asignó a otro vehículo genera un error. Antes de asignar una tarea al nuevo vehículo, cierra la tarea existente y, luego, crea una nueva.
Puedes actualizar el orden de las tareas en cualquier momento.
Antes de actualizar el pedido de tareas de un vehículo, asegúrate de que el vehículo y ya se crearon en Fleet Engine. A continuación, actualiza el orden de las tareas. para el vehículo, como se muestra en el siguiente ejemplo.
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleReporter reporter = api.getDeliveryVehicleReporter();
try {
List<VehicleStop> stops = reporter.setVehicleStops(
ImmutableList.of(
VehicleStop.builder()
.setVehicleStopState(VehicleStopState.ARRIVED)
.setWaypoint(Waypoint.builder().setLatLng(37.1749, 122.412).build())
.setTasks(ImmutableList.of(task1)) // Previously created DeliveryTask in Fleet Engine.
.build(),
VehicleStop.builder()
.setVehicleStopState(VehicleStopState.NEW) // The current vehicle stop.
.setWaypoint(Waypoint.builder().setLatLng(37.7749, 122.4194).build())
.setTasks(ImmutableList.of(task2)) // Previously created DeliveryTask in Fleet Engine.
.build(),
VehicleStop.builder()
.setVehicleStopState(VehicleStopState.NEW)
.setWaypoint(Waypoint.builder().setLatLng(37.3382, 121.8863).build())
.setTasks(ImmutableList.of(task3, task4)) // Previously created DeliveryTasks in Fleet Engine.
.build())).get();
// Successfully updated vehicle stops in Fleet Engine. Returns the successfully set VehicleStops.
} catch (Exception e) {
// Failed to update vehicle stops in Fleet Engine. Setting VehicleStops must be attempted again after resolving
// errors.
}
Es posible que ocurra una excepción que podría impedir que se realice una actualización
al estado interno del SDK del controlador. Si esto sucede, resuelve el problema y, luego,
Vuelve a llamar a setVehicleStops
hasta que la llamada se realice de forma correcta.
Entre los posibles problemas, se incluyen los siguientes:
Las VehicleStops especificadas no siguen un patrón válido. Solo el primero VehicleStop puede estar en cualquiera de los campos VehicleStopStates: NEW, ENROUTE o ARRIVED. Los vehículos VehicleStops después de la parada actual deben estar en el estado NUEVO VehicleStopState.
Las tareas no existen o pertenecen a otro vehículo.
El vehículo no existe.
El vehículo está en camino a la siguiente parada
Fleet Engine debe ser notificado cuando un vehículo sale de una parada y cuándo comienza la navegación. Puedes notificar a Fleet Engine desde el SDK del controlador.
Antes de notificar a Fleet Engine que un vehículo salió de una parada, asegúrate de lo siguiente: se crearon y configuraron las paradas del vehículo. Luego, notifica a Fleet Engine las salida del vehículo, como se muestra en el siguiente ejemplo.
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleReporter reporter = api.getDeliveryVehicleReporter();
reporter.enableLocationTracking(); // Location tracking must be enabled.
// Create Vehicle, VehicleStops, and DeliveryTasks.
// Set VehicleStops on Vehicle.
navigator.setDestination(vehicleStop.getWaypoint());
try {
List<VehicleStop> updatedStops = reporter.enrouteToNextStop().get();
// Successfully updated vehicle stops in Fleet Engine. Returns the set VehicleStops, with the first
// VehicleStop updated to ENROUTE state.
} catch (Exception e) {
// Failed to update vehicle stops in Fleet Engine. Updating VehicleStops must be attempted again
// after resolving errors.
}
Es posible que se produzca una excepción que podría impedir una actualización del SDK del controlador.
su estado interno. Si esto sucede, resuelve el problema y, luego, llama
enrouteToNextStop
hasta que se complete correctamente.
Entre los posibles problemas, se incluyen los siguientes:
- No quedan
VehicleStops
configurados en el SDK de Driver.
El vehículo llega a una parada
Fleet Engine debe recibir una notificación cuando un vehículo llega a una parada. Puedes notificar a Fleet Engine desde el SDK del controlador.
Antes de notificar a Fleet Engine que un vehículo llegó a una parada, asegúrate de que las se hayan configurado paradas del vehículo. Luego, notifica a Fleet Engine la llegada del vehículo en la parada, como se muestra en el siguiente ejemplo.
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleReporter reporter = api.getDeliveryVehicleReporter();
reporter.enableLocationTracking(); // Location tracking must be enabled.
// Create Vehicle, VehicleStops, and DeliveryTasks.
// Set VehicleStops on Vehicle.
// Mark ENROUTE to VehicleStop and start guidance using Navigator.
try {
List<VehicleStop> updatedStopsArrived = reporter.arrivedAtStop().get();
// Successfully updated vehicle stops in Fleet Engine. Returns the set VehicleStops, with the first
// VehicleStop updated to ARRIVED state.
navigator.clearDestinations();
} catch (Exception e) {
// Failed to update vehicle stops in Fleet Engine. Updating VehicleStops must be attempted again
// after resolving errors.
}
Puede ocurrir una excepción que podría impedir que se actualice la versión interna del SDK del controlador
para cada estado. Si esto sucede, resuelve el problema y, luego, vuelve a llamar a arrivedAtStop
hasta que tenga éxito.
Estos son algunos de los posibles problemas:
- No quedan
VehicleStops
configurados en el SDK de Driver.
El vehículo completa una parada
Debes notificar a Fleet Engine cuando un vehículo complete una parada. Esta notificación hace que todas las tareas asociadas con la parada se establezcan en el estado CLOSED. Puedes notificar a Fleet Engine desde el SDK del controlador.
Notificar a Fleet Engine que el vehículo completó su VehicleStop como se muestra en en el siguiente ejemplo.
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleReporter reporter = api.getDeliveryVehicleReporter();
reporter.enableLocationTracking(); // Location tracking must be enabled.
// After completing the tasks at the VehicleStop, remove it from the
// the current list of VehicleStops.
try {
List<VehicleStop> updatedStopsCompleted = reporter.completedStop().get();
// Successfully updated vehicle stops in Fleet Engine. All tasks on the completed stop are set to CLOSED.
// Returns the set VehicleStops, with the completed VehicleStop removed from the remaining list.
} catch (Exception e) {
// Failed to update vehicle stops in Fleet Engine. Updating VehicleStops must be attempted again
// after resolving errors.
}
Puede ocurrir una excepción que podría impedir que se actualice la versión interna del SDK del controlador
para cada estado. Si esto sucede, resuelve el problema y, luego, vuelve a llamar a completedStop
hasta que tenga éxito.
Estos son algunos de los posibles problemas:
- No quedan
VehicleStops
configurados en el SDK de Driver.
Cómo cerrar una tarea
Para cerrar una tarea que se asignó a un vehículo, notifica a Fleet Engine que el vehículo completó la parada en la que se realiza la tarea o quítalo de la lista de paradas del vehículo. Para ello, puedes establecer la lista de el vehículo restante se detiene al igual que cuando actualizar el pedido de tareas de un vehículo
Si aún no se asignó un vehículo a una tarea y esta debe cerrarse, actualiza el la tarea a un estado CLOSED. Sin embargo, no puedes volver a abrir una tarea CERRADA.
Cerrar una tarea no indica éxito o fracaso. Indica que la tarea ya no se considera en curso. Para el seguimiento de envíos, es importante indican el resultado real de una tarea para que se pueda mostrar un resultado de entrega.
Para poder usar el SDK del controlador, se debe asignar una tarea a un vehículo para cerrar la tarea. Para cerrar una tarea que se asignó a un vehículo, notifica Fleet Engine, que el vehículo completó la parada en la que se realiza la tarea.
Como alternativa, actualiza el orden de las tareas del vehículo. a la que está asignada la tarea y, luego, quítala de la lista de paradas.
Establecer el resultado de la tarea y su ubicación
Cerrar una tarea no indica el éxito o el fracaso de la operación. Indica que la tarea ya no se considera en curso. Para el seguimiento de envíos, es importante indican el resultado real de una tarea para que se pueda mostrar un resultado de entrega, y así que la facturación de los servicios sea adecuada. Una vez establecida, no puedes cambiar la el resultado de la tarea. Pero puedes modificar el tiempo y la ubicación del resultado de la tarea después de haberlos establecido.
Las tareas que están en estado CERRADO pueden tener el resultado configurado en EXITOSA o FALLIDA. Fleet Engine solo cobra las tareas de entrega con el estado de COMPLETA.
Cuando marcas el resultado de una tarea, Fleet Engine completa automáticamente el la ubicación del resultado de la tarea con la última ubicación conocida del vehículo. Puedes anular este comportamiento.
En el siguiente ejemplo, se muestra cómo usar el SDK de Driver para establecer el resultado de una tarea y marca de tiempo. No puedes establecer la ubicación del resultado de las tareas con el SDK del controlador.
static final String TASK_ID = "task-8241890";
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryTaskManager taskManager = api.getDeliveryTaskManager();
// Updating an existing DeliveryTask which is already CLOSED. Manually
// setting TaskOutcomeLocation with Driver SDK is not supported at this time.
UpdateDeliveryTaskRequest req = UpdateDeliveryTaskRequest.builder(TASK_ID)
.setTaskOutcome(TaskOutcome.SUCCEEDED)
.setTaskOutcomeTimestamp(now()) // Timestamp in milliseconds.
.build();
try {
DeliveryTask updatedTask = taskManager.updateTask(req);
// Handle UpdateTaskRequest DeliveryTask response.
} catch (Exception e) {
// Handle UpdateTaskRequest error.
}
Buscar un vehículo
Puedes buscar un vehículo desde el SDK del controlador. Antes de buscar un vehículo, asegurarte de que inicializar la API de Delivery Driver Luego, puedes buscar el vehículo como se muestra en el siguiente ejemplo.
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleManager vehicleManager = api.getDeliveryVehicleManager();
try {
DeliveryVehicle vehicle = vehicleManager.getVehicle().get();
// Handle GetVehicleRequest DeliveryVehicle response.
} catch (Exception e) {
// Handle GetVehicleRequest error.
}
El elemento DeliveryVehicleManager
solo puede buscar el elemento DeliveryVehicle
para el ID del vehículo que se proporcionó durante la inicialización de la API de Delivery Driver.