Configuration système minimale requise
L'appareil mobile doit être équipé d'Android 6.0. (niveau d'API 23) ou version ultérieure.
Configuration de la compilation et des dépendances
Les versions 4.99 et ultérieures du SDK Driver 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 version ultérieure. Pour en savoir plus, consultez
Notes de version
Pour que vous puissiez exécuter une application créée avec le SDK Driver, l'appareil Android doit disposer Services Google Play installés.
Configurer votre projet de développement
Configurer votre projet de développement et obtenir une clé API du projet dans la console Google Cloud:
Créer une console Google Cloud ou sélectionnez un projet existant pour l'utiliser avec le SDK Driver. Patientez quelques minutes jusqu'à le nouveau projet est visible dans la console Google Cloud.
Pour que vous puissiez 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 Obtenez une clé API.
Ajouter le SDK Driver à votre application
Le SDK Driver est disponible dans le dépôt Maven de Google. La qui inclut les fichiers .pom (Project Object Model) du SDK ainsi que des documents 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 de le 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>
le SDK Driver dépend du SDK Navigation, cette dépendance est configurée que si une version spécifique du SDK Navigation est nécessaire, explicitement défini dans le fichier de configuration de compilation, comme suit : si vous omettez le bloc de code mentionné, le projet pourra toujours télécharger la dernière version du SDK Navigation dans la version majeure. Notez que les comportements combinés des dernières versions de Driver SDK et Le SDK Navigation a fait l'objet de tests rigoureux avant sa publication.
Organiser la configuration des dépendances de votre développement et de votre version en conséquence.
Gradle
Ajoutez les éléments suivants à votre
build.gradle
:dependencies { ... implementation 'com.google.android.libraries.navigation:navigation:5.0.0' }
Maven
Ajoutez les éléments suivants à votre
pom.xml
:<dependencies> ... <dependency> <groupId>com.google.android.libraries.navigation</groupId> <artifactId>navigation</artifactId> <version>5.0.0</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. Toi doit utiliser la clé API du projet que vous avez obtenue lorsque vous avez configurer votre projet de développement.
Cette section explique comment stocker votre clé API afin de la sécuriser
référencées par votre application. Vous ne devez pas vérifier votre clé API dans votre version
système de contrôle. Il doit être stocké dans le fichier local.properties
, qui est
situé dans le répertoire racine de votre projet. Pour en savoir plus sur la
Fichier local.properties
, voir
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 les données de manière sécurisée votre clé API.
Ouvrez le fichier
build.gradle
au niveau racine et ajoutez le code suivant àdependencies
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 au É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 le répertoire au niveau du projet, puis ajoutez le 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
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 texte d'attribution et licences Open Source dans les mentions légales de votre application. . Il est préférable d'inclure les mentions sous la forme d'un élément de menu indépendant ou qui fait partie d'un élément de menu À propos.
Les informations sur les licences se trouvent dans le fichier "third_party_licenses.txt". dans le fichier AAR désarchivé.
Consultez https://developers.google.com/android/guides/opensource. sur la façon d'inclure les notifications Open Source.
Dépendances
Le SDK Driver utilise gRPC vers communiquer avec le serveur Fleet Engine. Si vous n'intégrez pas déjà 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 des erreurs lors de l'exécution lorsque vous essayez de communiquer avec le serveur Fleet Engine.
Si vous utilisez ProGuard pour optimiser vos builds, vous devrez peut-être ajouter les lignes suivantes à votre ProGuard configuration Terraform:
-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 du projet Google Cloud) est nécessaire pour
initialisez l'objet DriverContext
. Pour en savoir plus sur la configuration
pour un projet Google Cloud, consultez
Authentification et autorisation
Avant d'utiliser le SDK Driver, vous devez 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 renseignant 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);
Obtenez
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 la position,
il doit envoyer ces
mises à jour à
le serveur Fleet Engine. Pour authentifier ces requêtes,
Le SDK pilote appelle un fichier fourni par l'appelant
Instance de AuthTokenFactory
.
La fabrique est chargée de générer des jetons d'authentification sur le site
l'heure de mise à jour.
La manière exacte dont les jetons sont générés dépend de la situation de chaque développeur. Cependant, l'implémentation doit probablement:
- Extraire un jeton d'authentification, éventuellement au format JSON, à partir d'un serveur HTTPS
- analyser et mettre en cache le jeton ;
- actualiser le jeton lorsqu'il expire
Pour en savoir plus sur les jetons attendus par le serveur Fleet Engine, consultez 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;
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);
}
}
}
Cette implémentation particulière utilise le client HTTP Java intégré pour récupérer au format JSON provenant du serveur d'authentification du développeur. Le jeton est enregistrées pour être réutilisées. Le jeton est de nouveau récupéré si l'ancien jeton est disponible dans les 10 minutes maximum de son délai d'expiration.
Votre implémentation peut se comporter différemment, par exemple en utilisant un thread d'arrière-plan pour actualiser les jetons.
Les exceptions dans AuthTokenFactory
sont traitées comme temporaires, sauf si elles se produisent
à plusieurs reprises. Après plusieurs tentatives, le SDK Driver
suppose que l'erreur est permanente et arrête toute tentative d'envoi de mises à jour.
Rapports d'état et d'erreurs avec StatusListener
Étant donné que le SDK Driver effectue des actions dans
arrière-plan, utilisez le 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
de nature temporaire (BACKEND_CONNECTIVITY_ERROR
, par exemple) ou qui peuvent
entraîner l'arrêt définitif des mises à jour de la position (VEHICLE_NOT_FOUND
,
indiquant une erreur de configuration).
Vous fournissez une implémentation StatusListener
facultative comme celle-ci:
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, l'implémentation du SDK Driver utilise
SSL/TLS pour communiquer en toute sécurité avec le serveur Fleet Engine. Versions antérieures
d'Android (version 23 ou
précédemment) peuvent nécessiter un correctif SecurityProvider
pour communiquer avec
Google Cloud. Pour en savoir plus sur l'utilisation de SSL dans Android, consultez
Fournisseur GMS de sécurité.
Il contient également des exemples de code permettant d'appliquer un correctif au fournisseur de solutions 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
simple:
DeliveryVehicleReporter reporter = ...;
reporter.enableLocationTracking();
Les mises à jour de la position sont envoyées à intervalles réguliers, si possible. Chaque établissement indique également que le véhicule est en ligne.
Par défaut, l'intervalle du rapport est de 10 secondes. Vous pouvez modifier les paramètres
intervalle avec reporter.setLocationReportingInterval(long, TimeUnit)
. La
l'intervalle minimal de mise à jour pris en charge est de 5 secondes. Des mises à jour plus fréquentes peuvent
ce qui ralentit les requêtes et entraîne des erreurs.
Désactiver les notifications de position
Une fois le quart de 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 mettre en œuvre des cas d'utilisation courants à l'aide du SDK Driver lorsque vous utilisez le 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, assurez-vous initialisez l'API Delivery Driver. L'ID du véhicule doit être créé avec l'ID du véhicule et celui du fournisseur utilisés pendant l'initialisation du SDK Driver. 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 en livraison
Vous pouvez créer une tâche de retrait d'un colis à partir du SDK Driver.
Avant de créer une tâche, assurez-vous de initialisez l'API Delivery Driver. La tâche doit être créée à l'aide de l'ID de fournisseur spécifié dans Driver SDK l'initialisation. Créez ensuite la tâche de retrait en magasin, comme indiqué ci-dessous à titre d'exemple. Pour en savoir plus sur les ID de tâche, consultez des 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
Vous pouvez créer une tâche de livraison à partir du SDK Driver.
Avant de créer une tâche, assurez-vous de initialisez 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 page 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 un pilote ou le ravitaillement en carburant d'un véhicule) à partir du SDK Driver. Indisponibilité planifiée la tâche ne doit pas inclure d'ID de suivi. Vous pouvez éventuellement indiquer un lieu.
Avant de créer une tâche, assurez-vous de initialisez l'API Delivery Driver. Créez ensuite la tâche d'indisponibilité, comme illustré dans l'exemple suivant. Pour en savoir plus sur les ID de tâche, consultez la page 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 à partir du SDK Driver. A planifié la tâche d'arrêt n'inclut peut-être pas d'ID de suivi.
Avant de créer une tâche, assurez-vous de initialisez l'API Delivery Driver. Créez ensuite la tâche d'arrêt planifié, comme indiqué dans l'exemple suivant. Pour en savoir plus sur les ID de tâche, consultez la page 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.
}
Mettre à jour l'ordre des tâches
Vous pouvez mettre à jour l'ordre d'exécution des tâches attribuées à un véhicule à partir de SDK Driver.
La mise à jour de l'ordre des tâches attribue également les tâches à un véhicule si elles n'étaient pas précédemment attribués à un véhicule. Elle ferme également les tâches qui étaient auparavant attribués à un véhicule et ont été exclus de l'ordre mis à jour. Attribuer une une tâche à un autre véhicule si elle avait été précédemment 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éer une nouvelle tâche.
Vous pouvez modifier l'ordre des tâches à tout moment.
Avant de mettre à jour l’ordre des tâches pour un véhicule, assurez-vous que le véhicule et ont déjà été créées dans Fleet Engine. Ensuite, mettez à jour 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 empêcher une mise à jour
à l'état interne du SDK Driver. Le cas échéant, résolvez le problème, puis
appelez à nouveau setVehicleStops
jusqu'à ce que l'appel aboutisse.
Voici quelques exemples de problèmes potentiels:
Les arrêts de véhicule spécifiés ne suivent pas un schéma valide. Uniquement la première Le champ VehicleStop peut être dans n'importe quel état d'arrêt de véhicule: NEW, ENROUTE ou ARRIVED. Les arrêts de véhicules après l'arrêt actuel doivent être dans le NEW VehicleStopState.
Les tâches n'existent pas ou appartiennent à un autre véhicule.
Le véhicule n'existe pas.
Le véhicule est en route pour le prochain arrêt
Fleet Engine doit être averti lorsqu'un véhicule quitte un arrêt et lorsqu'il lance la navigation. 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 des véhicules ont été créés et définis. Informez ensuite Fleet Engine 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 empêcher la mise à jour du SDK Driver
état interne. Le cas échéant, résolvez le problème, puis appelez
enrouteToNextStop
jusqu'à ce que l'opération réussisse.
Voici quelques exemples de problèmes potentiels:
- Aucun élément
VehicleStops
restant défini dans le SDK Driver.
Le véhicule arrive à un arrêt
Fleet Engine doit recevoir une notification lorsqu'un véhicule arrive à un arrêt. Vous pouvez notifier 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 des véhicules 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 empêcher la mise à jour du fichier interne du SDK Driver
state. Le cas échéant, résolvez le problème, puis appelez de nouveau arrivedAtStop
.
jusqu'à ce qu'elle soit réussie.
Voici quelques exemples de problèmes potentiels:
- Aucun élément
VehicleStops
restant défini dans le SDK Driver.
Le véhicule termine un arrêt
Vous devez avertir Fleet Engine lorsqu'un véhicule s'arrête. Cette notification toutes les tâches associées à l'arrêt sont définies sur l'état CLOSED. Vous pouvez notifier Fleet Engine à partir du SDK Driver.
Informer 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 empêcher la mise à jour du fichier interne du SDK Driver
state. Le cas échéant, résolvez le problème, puis appelez de nouveau completedStop
.
jusqu'à ce qu'elle soit réussie.
Voici quelques exemples de problèmes potentiels:
- Aucun élément
VehicleStops
restant défini dans le SDK Driver.
Fermer une tâche
Pour fermer une tâche qui a été attribuée à un véhicule, informez-en Fleet Engine que le véhicule a terminé l’arrêt où la tâche a lieu, ou le supprimer de la liste des arrêts du véhicule. Pour ce faire, vous pouvez définir la liste le véhicule restant s'arrête mettre à jour l'ordre des tâches pour un véhicule ;
Si une tâche n'a pas encore été attribuée à un véhicule et qu'il doit être fermé, mettez à jour le la tâche à l'état CLOSED. Toutefois, vous ne pouvez pas rouvrir une tâche CLOSED.
La fermeture d'une tâche n'indique pas la réussite ou l'échec. Il indique que la tâche n'est plus considéré comme étant en cours. Pour le suivi d'un envoi, il est important indiquer le résultat réel d'une tâche afin qu'un résultat de livraison puisse être affiché.
Vous devez attribuer une tâche à un véhicule pour pouvoir utiliser le SDK Driver pour fermer la tâche. Pour fermer une tâche attribuée à un véhicule, notifiez Fleet Engine que le véhicule a terminé l'arrêt où la tâche a lieu.
Vous pouvez également modifier l'ordre des tâches du véhicule. auquel la tâche est attribuée, puis la supprimer de la liste des s'arrête.
Définir le résultat de la tâche et le lieu du résultat
La fermeture d'une tâche n'indique pas la réussite ou l'échec. Il indique que la tâche n'est plus considéré comme étant en cours. Pour le suivi d'un envoi, il est important indiquer le résultat réel d'une tâche afin qu'un résultat de livraison puisse être montré, et donc qu'il y a une facturation appropriée pour les services. Une fois défini, vous ne pouvez plus modifier le résultat de la tâche. Mais vous pouvez modifier l'heure du résultat de la tâche 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 (Réussite) ou FAILED (ÉCHEC). Fleet Engine ne facture que les tâches de livraison dont l'état est RÉUSSITE.
Lorsque vous marquez le résultat d'une tâche, Fleet Engine remplit automatiquement le le lieu du résultat de la tâche avec la dernière position connue du véhicule. Vous pouvez remplacer ce comportement.
L'exemple suivant montre comment définir un résultat de tâche à l'aide du SDK Driver et l'horodatage. Vous ne pouvez pas définir l'emplacement du résultat d'une tâche à 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 chercher un véhicule, de vérifier initialisez 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.
}
Le DeliveryVehicleManager
ne peut rechercher que le DeliveryVehicle
pour l'ID du véhicule fourni lors de l'initialisation de l'API Delivery Driver.