Configuration système minimale requise
L'appareil mobile doit être équipé d'Android 6.0 (niveau d'API 23) ou version ultérieure.
Configuration Maven
Les versions 4.99 et ultérieures du SDK pilote sont disponibles dans le dépôt Maven de Google.
Gradle
Ajoutez le code ci-dessous à votre fichier build.gradle
:
repositories {
...
google()
}
Maven
Ajoutez le code ci-dessous à votre fichier pom.xml
:
<project>
...
<repositories>
<repository>
<id>google-maven-repository</id>
<url>https://maven.google.com</url>
</repository>
</repositories>
...
</project>
Configuration du projet
Pour utiliser le SDK Driver, votre application doit cibler minSdkVersion
23 ou une version ultérieure. Pour en savoir plus, consultez la page Notes de version.
Pour exécuter une application créée avec le SDK Driver, les services Google Play doivent être installés sur l'appareil Android.
Configurer votre projet de développement
Pour configurer votre projet de développement et obtenir une clé API pour le projet dans la console Google Cloud:
Créez un projet dans la console Google Cloud ou sélectionnez un projet existant à utiliser avec le SDK Driver. Attendez quelques minutes jusqu'à ce que le nouveau projet soit visible dans la console Google Cloud.
Pour exécuter l'application de démonstration, votre projet doit avoir accès au SDK Maps pour Android. Dans la console Google Cloud, sélectionnez API et services > Bibliothèque, puis recherchez et activez le SDK Maps pour Android.
Obtenez une clé API pour le projet en sélectionnant API et services > Identifiants > Créer des identifiants > Clé API. Pour savoir comment obtenir une clé API, consultez Obtenir une clé API.
Ajouter le SDK Driver à votre application
Le SDK Driver est disponible dans le dépôt Maven de Google. Le dépôt comprend les fichiers .pom (Project Object Model) du SDK et les Javadocs. Pour ajouter le SDK Driver à votre application:
Ajoutez la dépendance suivante à votre configuration Gradle ou Maven, en remplaçant l'espace réservé
VERSION_NUMBER
par la version sélectionnée du SDK Driver.Gradle
Ajoutez les éléments suivants à votre
build.gradle
:dependencies { ... implementation 'com.google.android.libraries.mapsplatform.transportation:transportation-driver:[VERSION_NUMBER]' }
Maven
Ajoutez les éléments suivants à votre
pom.xml
:<dependencies> ... <dependency> <groupId>com.google.android.libraries.mapsplatform.transportation.driver</groupId> <artifactId>transportation-driver</artifactId> <version>[VERSION_NUMBER]</version> </dependency> </dependencies>
Ajouter la clé API à votre application
Une fois que vous avez ajouté le SDK Driver à votre application, ajoutez la clé API à celle-ci. Vous devez utiliser la clé API du projet que vous avez obtenue lorsque vous avez configuré votre projet de développement.
Cette section explique comment stocker votre clé API afin qu'elle puisse être référencée de manière plus sécurisée par votre application. Vous ne devez pas enregistrer votre clé API dans votre système de contrôle des versions. Il doit être stocké dans le fichier local.properties
, qui se trouve dans le répertoire racine de votre projet. Pour en savoir plus sur le fichier local.properties
, consultez Fichiers de propriétés Gradle.
Pour vous faciliter la tâche, utilisez le plug-in Secrets Gradle pour Android. Suivez cette procédure pour installer le plug-in Secrets Gradle et stocker votre clé API de manière sécurisée.
Ouvrez votre fichier
build.gradle
racine et ajoutez le code suivant à l'élémentdependencies
sousbuildscript
.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") } }
Ouvrez le fichier
build.gradle
au niveau de l'application et ajoutez le code suivant à l'élémentplugins
.Groovy
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
Kotlin
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
Ouvrez
local.properties
dans votre répertoire au niveau du projet, puis ajoutez le code suivant. Veillez à remplacerYOUR_API_KEY
par votre clé API.MAPS_API_KEY=YOUR_API_KEY
Dans votre fichier
AndroidManifest.xml
, accédez àcom.google.android.geo.API_KEY
et mettez à jour l'attributandroid:value
comme suit:<meta-data android:name="com.google.android.geo.API_KEY" android:value="${MAPS_API_KEY}" />
L'exemple suivant présente un fichier manifeste complet pour une application exemple:
<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>
Inclure les attributions requises dans votre application
Si vous utilisez le SDK Driver dans votre application, vous devez inclure un texte d'attribution et des licences Open Source dans la section des mentions légales de votre application. Il est préférable d'inclure les attributions dans un élément de menu indépendant ou dans un élément de menu About (À propos).
Vous trouverez le texte d'attribution et les licences Open Source requis dans le fichier ZIP du SDK Drive:
NOTICE.txt
LICENSES.txt
Dépendances
Le SDK Driver utilise gRPC pour communiquer avec le serveur Fleet Engine. Si vous n'importez pas encore gRPC, vous devrez peut-être déclarer les dépendances suivantes:
dependencies {
implementation 'io.grpc:grpc-android:1.12.0'
implementation 'io.grpc:grpc-okhttp:1.12.0'
}
Sans ces dépendances, le SDK Driver peut rencontrer des erreurs au moment de l'exécution lorsqu'il tente de communiquer avec le serveur Fleet Engine.
Si vous utilisez ProGuard pour optimiser vos builds, vous devrez peut-être ajouter les lignes suivantes à votre fichier de configuration ProGuard:
-dontwarn com.google.**
-dontwarn io.grpc.**
-dontwarn okio.**
Le niveau d'API minimal accepté est 23.
Initialiser le SDK
Un ID de fournisseur (généralement l'ID de projet Google Cloud) est nécessaire pour initialiser l'objet DriverContext
. Pour en savoir plus sur la configuration du projet Google Cloud, consultez la page Authentification et autorisation.
Avant d'utiliser le SDK Driver, vous devez d'abord initialiser le SDK Navigation. Pour initialiser le SDK, procédez comme suit :
Obtenez un objet
Navigator
à partir 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; } } );
Créez un objet
DriverContext
en remplissant les champs obligatoires.DriverContext driverContext = DriverContext.builder(application) .setProviderId(providerId) .setVehicleId(vehicleId) .setAuthTokenFactory(authTokenFactory) .setNavigator(navigator) .setRoadSnappedLocationProvider( NavigationApi.getRoadSnappedLocationProvider(application)) .build();
Utilisez l'objet
DriverContext
pour initialiser*DriverApi
.DeliveryDriverApi driverApi = DeliveryDriverApi.createInstance(driverContext);
Récupérez
DeliveryVehicleReporter
à partir de l'objet API. (DeliveryVehicleReporter
étendNavigationVehicleReporter
.)DeliveryVehicleReporter vehicleReporter = driverApi.getDeliveryVehicleReporter();
Authentification avec AuthTokenFactory
...
Lorsque le SDK Driver génère des mises à jour de position, il doit les envoyer au serveur Fleet Engine. Pour authentifier ces requêtes, le SDK Driver appelle une instance de AuthTokenFactory
fournie par l'appelant.
L'usine est chargée de générer des jetons d'authentification au moment de la mise à jour des établissements.
Le mode de génération des jetons dépend de la situation de chaque développeur. Toutefois, l'implémentation devra probablement:
- récupérer un jeton d'authentification, éventuellement au format JSON, à partir d'un serveur HTTPS
- analyser et mettre en cache le jeton ;
- actualiser le jeton à son expiration ;
Pour en savoir plus sur les jetons attendus par le serveur Fleet Engine, consultez la page Créer un jeton Web JSON (JWT) pour l'autorisation.
Voici un squelette d'implémentation d'un AuthTokenFactory
:
class JsonAuthTokenFactory implements AuthTokenFactory {
private String vehicleServiceToken; // initially null
private long expiryTimeMs = 0;
// 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) {
if (System.currentTimeMillis() > expiryTimeMs) {
// The token has expired, go get a new one.
fetchNewToken(vehicleId);
}
if (ServiceType.VEHICLE.equals(authTokenContext.getServiceType)) {
return vehicleServiceToken;
} else {
throw new RuntimeException("Unsupported ServiceType: " + authTokenContext.getServiceType());
}
}
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;
} 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);
}
}
}
Cette implémentation utilise le client HTTP Java intégré pour récupérer un jeton au format JSON à partir du serveur d'authentification du développeur. Le jeton est enregistré pour être réutilisé. Le jeton est à nouveau récupéré si l'ancien jeton est dans un délai de 10 minutes avant son délai d'expiration.
Votre implémentation peut agir différemment, par exemple utiliser un thread en arrière-plan pour actualiser les jetons.
Les exceptions dans AuthTokenFactory
sont traitées comme temporaires, sauf si elles se produisent de manière répétée. Après un certain nombre de tentatives, le SDK Driver considère que l'erreur est permanente et cesse d'essayer d'envoyer des mises à jour.
État et Error Reporting avec StatusListener
Étant donné que le SDK Driver effectue des actions en arrière-plan, utilisez StatusListener
pour déclencher des notifications lorsque certains événements se produisent, tels que des erreurs, des avertissements ou des messages de débogage. Les erreurs peuvent être temporaires (par exemple, BACKEND_CONNECTIVITY_ERROR
) ou entraîner l'arrêt définitif des mises à jour de la position (par exemple, VEHICLE_NOT_FOUND
, qui indique une erreur de configuration).
Vous fournissez une implémentation StatusListener
facultative comme suit:
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.
}
}
Remarques sur SSL/TLS
En interne, la mise en œuvre du SDK pilote utilise SSL/TLS pour communiquer de manière sécurisée avec le serveur Fleet Engine. Les versions antérieures d'Android (API 23 ou versions antérieures) peuvent nécessiter un correctif SecurityProvider
pour communiquer avec le serveur. Pour en savoir plus sur l'utilisation de SSL dans Android, consultez la page Fournisseur GMS de sécurité.
Il contient également des exemples de code permettant d'appliquer des correctifs au fournisseur de sécurité.
Activer les mises à jour de la position
Une fois que vous disposez d'une instance *VehicleReporter
, l'activation des mises à jour de la position est simple:
DeliveryVehicleReporter reporter = ...;
reporter.enableLocationTracking();
Si possible, les mises à jour de la position sont envoyées à intervalles réguliers. Chaque mise à jour de la position indique également que le véhicule est en ligne.
Par défaut, l'intervalle de reporting est de 10 secondes. Vous pouvez modifier l'intervalle de reporting avec reporter.setLocationReportingInterval(long, TimeUnit)
. L'intervalle minimal de mise à jour accepté est de 5 secondes. Des mises à jour plus fréquentes peuvent ralentir les requêtes et les erreurs.
Désactiver les mises à jour de la position géographique
Une fois le travail du conducteur terminé, vous pouvez arrêter les mises à jour de la position en appelant DeliveryVehicleReporter.disableLocationTracking
.
Cas d'utilisation des modèles de confiance
Cette section explique comment utiliser le SDK Driver pour implémenter des cas d'utilisation courants du modèle de confiance.
Créer un véhicule
Vous pouvez créer un véhicule à partir du SDK Driver.
Avant de créer un véhicule, veillez à initialiser l'API Delivery Driver. L'ID du véhicule doit être créé avec l'ID du véhicule et du fournisseur utilisés lors de l'initialisation du SDK Conducteur. Créez ensuite le véhicule comme indiqué dans l'exemple suivant:
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleManager vehicleManager = api.getDeliveryVehicleManager();
try {
DeliveryVehicle vehicle = vehicleManager.createVehicle().get();
// Handle CreateVehicleRequest DeliveryVehicle response.
} catch (Exception e) {
// Handle CreateVehicleRequest error.
}
Créer une tâche de retrait de colis
Vous pouvez créer une tâche de retrait à livrer à partir du SDK Driver.
Avant de créer une tâche, veillez à initialiser l'API Delivery Driver. La tâche doit être créée à l'aide de l'ID de fournisseur spécifié lors de l'initialisation du SDK Driver. Créez ensuite la tâche de retrait à la livraison comme indiqué dans l'exemple suivant. Pour en savoir plus sur les ID de tâche, consultez Exemples d'ID de tâche.
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.
}
Créer une tâche de livraison d'expédition
Vous pouvez créer une tâche de livraison à partir du SDK Driver.
Avant de créer une tâche, veillez à initialiser l'API Delivery Driver. Créez ensuite la tâche de livraison, comme illustré dans l'exemple suivant. Pour en savoir plus sur les ID de tâche, consultez la section Exemples d'ID de tâche.
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.
}
Indisponibilité planifiée
Vous pouvez créer une tâche indiquant une indisponibilité (par exemple, pour les pauses du conducteur ou le ravitaillement d'un véhicule) à partir du SDK Driver. Une tâche d'indisponibilité planifiée ne doit pas inclure d'ID de suivi. Vous pouvez éventuellement indiquer un lieu.
Avant de créer une tâche, veillez à initialiser l'API Delivery Driver. Créez ensuite la tâche d'indisponibilité comme indiqué dans l'exemple suivant. Pour en savoir plus sur les ID de tâche, consultez la section Exemples d'ID de tâche.
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.
}
Arrêts planifiés
Vous pouvez créer une tâche d'arrêt planifiée depuis le SDK Driver. Une tâche d'arrêt planifiée peut ne pas inclure d'ID de suivi.
Avant de créer une tâche, veillez à initialiser l'API Delivery Driver. Créez ensuite la tâche d'arrêt programmée, comme illustré dans l'exemple suivant. Pour en savoir plus sur les ID de tâche, consultez la section Exemples d'ID de tâche.
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.
}
Modifier l'ordre des tâches
Vous pouvez modifier l'ordre d'exécution des tâches attribuées à un véhicule à partir du SDK Driver.
La mise à jour de l'ordre des tâches attribue également des tâches à un véhicule si elles n'ont pas été attribuées précédemment à un véhicule. Elle ferme également les tâches précédemment attribuées à un véhicule et qui ont été omises de l'ordre mis à jour. L'attribution d'une tâche à un autre véhicule si elle a déjà été attribuée à un autre véhicule génère une erreur. Avant d'attribuer une tâche au nouveau véhicule, fermez la tâche existante, puis créez-en une autre.
Vous pouvez modifier l'ordre des tâches à tout moment.
Avant de modifier l'ordre des tâches d'un véhicule, assurez-vous que celui-ci et les tâches ont déjà été créés dans Fleet Engine. Modifiez ensuite l'ordre des tâches pour le véhicule, comme illustré dans l'exemple suivant.
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.
}
Une exception peut se produire et empêcher la mise à jour de l'état interne du SDK Driver. Dans ce cas, résolvez le problème, puis appelez de nouveau setVehicleStops
jusqu'à ce que l'appel aboutisse.
Voici quelques exemples de problèmes potentiels:
Les VehicleStops spécifiés ne suivent pas un schéma valide. Seul le premier VehicleStop peut être dans n'importe lequel des VehicleStopStates: NEW, ENROUTE ou ARRIVED. Le champ "VehicleStops" doit être défini sur "NEW VehicleStopState" après l'arrêt actuel.
Soit les tâches n'existent pas, soit elles appartiennent à un autre véhicule.
Le véhicule n'existe pas.
Véhicule en route vers le prochain arrêt
Fleet Engine doit être averti lorsqu'un véhicule quitte un arrêt et lorsqu'il commence à naviguer. Vous pouvez envoyer une notification à Fleet Engine à partir du SDK Driver.
Avant d'informer Fleet Engine qu'un véhicule a décollé d'un arrêt, assurez-vous que les arrêts de véhicules ont été créés et définis. Informez ensuite Fleet Engine du départ du véhicule, comme illustré dans l'exemple suivant.
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.
}
Une exception peut se produire et empêcher la mise à jour de l'état interne du SDK Driver. Si cela se produit, résolvez le problème, puis appelez à nouveau enrouteToNextStop
jusqu'à ce que l'opération réussisse.
Voici quelques exemples de problèmes potentiels:
- Aucun élément
VehicleStops
restant n'est défini dans le SDK Driver.
Le véhicule arrive à un arrêt
Fleet Engine doit être averti lorsqu'un véhicule arrive à un arrêt. Vous pouvez envoyer des notifications à Fleet Engine à partir du SDK Driver.
Avant d'informer Fleet Engine qu'un véhicule est arrivé à un arrêt, assurez-vous que les arrêts du véhicule ont été définis. Informez ensuite Fleet Engine de l'arrivée du véhicule à l'arrêt, comme illustré dans l'exemple suivant.
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.
}
Une exception peut se produire et empêcher la mise à jour de l'état interne du SDK pilote. Si cela se produit, résolvez le problème, puis appelez à nouveau arrivedAtStop
jusqu'à ce que l'opération aboutisse.
Voici des exemples de problèmes potentiels:
- Aucun élément
VehicleStops
restant n'est défini dans le SDK Driver.
Le véhicule effectue un arrêt
Vous devez avertir Fleet Engine lorsqu'un véhicule effectue un arrêt. Cette notification entraîne la définition de toutes les tâches associées à l'arrêt sur CLOSED (FERMÉE). Vous pouvez envoyer des notifications à Fleet Engine à partir du SDK Driver.
Informez Fleet Engine que le véhicule a terminé son arrêt de véhicule, comme illustré dans l'exemple suivant.
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.
}
Une exception peut se produire et empêcher la mise à jour de l'état interne du SDK pilote. Si cela se produit, résolvez le problème, puis appelez à nouveau completedStop
jusqu'à ce que l'opération aboutisse.
Voici quelques exemples de problèmes potentiels:
- Aucun élément
VehicleStops
restant n'est défini dans le SDK Driver.
Fermer une tâche
Pour fermer une tâche attribuée à un véhicule, informez Fleet Engine que le véhicule a terminé l'arrêt où la tâche a lieu ou supprimez-la de la liste des arrêts des véhicules. Pour ce faire, vous pouvez définir la liste des arrêts restants pour un véhicule, comme vous le feriez pour mettre à jour l'ordre des tâches pour un véhicule.
Si un véhicule n'a pas encore été attribué à une tâche et qu'elle doit être fermée, définissez-la sur FERMÉE. Toutefois, vous ne pouvez pas rouvrir une tâche FERMÉE.
La fermeture d'une tâche n'indique pas la réussite ou l'échec. Elle indique que la tâche n'est plus considérée comme en cours. Pour le suivi de l'expédition, il est important d'indiquer le résultat réel d'une tâche afin qu'un résultat de livraison puisse être affiché.
Une tâche doit être attribuée à un véhicule pour que vous puissiez la fermer à l'aide du SDK Driver. Pour fermer une tâche attribuée à un véhicule, informez Fleet Engine que le véhicule a terminé l'arrêt où la tâche a lieu.
Vous pouvez également mettre à jour l'ordre des tâches du véhicule auquel la tâche est attribuée, puis supprimer la tâche de la liste des arrêts.
Définir le résultat de la tâche et son emplacement
La fermeture d'une tâche n'indique pas la réussite ou l'échec. Elle indique que la tâche n'est plus considérée comme en cours. Pour le suivi des expéditions, il est important d'indiquer le résultat réel d'une tâche afin qu'un résultat de livraison puisse être affiché et que la facturation des services soit correctement effectuée. Une fois défini, vous ne pouvez pas modifier le résultat de la tâche. Toutefois, vous pouvez modifier l'heure et l'emplacement du résultat de la tâche après les avoir définis.
Le résultat des tâches à l'état FERMÉE peut être défini sur SUCCEEDED (SUCCEEDED) ou sur FAILED (ÉCHEC). Fleet Engine ne facture que les tâches de livraison dont l'état est SUCCEEDED.
Lors du marquage du résultat d'une tâche, Fleet Engine renseigne automatiquement l'emplacement du résultat de la tâche avec la dernière position connue du véhicule. Vous pouvez ignorer ce comportement.
L'exemple suivant montre comment définir un résultat et un code temporel de tâche à l'aide du SDK Driver. Vous ne pouvez pas définir l'emplacement du résultat des tâches à l'aide du SDK Driver.
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.
}
Rechercher un véhicule
Vous pouvez rechercher un véhicule à partir du SDK Driver. Avant de rechercher un véhicule, assurez-vous d'initialiser l'API Delivery Driver. Vous pouvez ensuite rechercher le véhicule comme illustré dans l'exemple suivant.
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleManager vehicleManager = api.getDeliveryVehicleManager();
try {
DeliveryVehicle vehicle = vehicleManager.getVehicle().get();
// Handle GetVehicleRequest DeliveryVehicle response.
} catch (Exception e) {
// Handle GetVehicleRequest error.
}
DeliveryVehicleManager
ne peut rechercher que le DeliveryVehicle
correspondant à l'ID du véhicule fourni lors de l'initialisation de l'API Delivery Driver.