Requisiti minimi di sistema
Sul dispositivo mobile deve essere installato Android 6.0 (livello API 23) o versioni successive.
Configurazione della build e delle dipendenze
Le versioni dell'SDK driver 4.99 e successive sono disponibili nel Repository Maven di Google.
Gradle
Aggiungi quanto segue al tuo file build.gradle
:
repositories {
...
google()
}
Maven
Aggiungi quanto segue al tuo file pom.xml
:
<project>
...
<repositories>
<repository>
<id>google-maven-repository</id>
<url>https://maven.google.com</url>
</repository>
</repositories>
...
</project>
Configurazione progetto
Per utilizzare l'SDK Driver, la tua app deve avere come target minSdkVersion
23 o successiva. Per ulteriori informazioni, vedi
Note di rilascio.
Per eseguire un'app creata con l'SDK Driver, il dispositivo Android deve avere Google Play Services installato.
Configura il progetto di sviluppo
Per configurare il progetto di sviluppo e ottenere una chiave API: per il progetto nella console Google Cloud:
Crea una nuova console Google Cloud. progetto o selezionarne uno esistente, da usare con l'SDK Driver. Attendi qualche minuto il nuovo progetto sia visibile nella console Google Cloud.
Per eseguire l'app demo, il progetto deve avere accesso a Maps SDK per Android. Nella console Google Cloud, seleziona API e Servizi > Library, quindi cerca e attiva Maps SDK per Android.
Ottieni una chiave API per il progetto selezionando API e Servizi > Credenziali > Crea le credenziali > chiave API. Per ulteriori informazioni su come ottenere una chiave API, consulta Ottieni una chiave API.
Aggiungi l'SDK Driver alla tua app
L'SDK Driver è disponibile nel Repository Maven di Google. La Il repository include i file Project Object Model (.pom) e Javadocs dell'SDK. Per aggiungere l'SDK Driver alla tua app:
Aggiungi la seguente dipendenza alla configurazione Gradle o Maven, sostituendo il segnaposto
VERSION_NUMBER
per la versione selezionata di l'SDK dei driver.Gradle
Aggiungi il seguente codice a
build.gradle
:dependencies { ... implementation 'com.google.android.libraries.mapsplatform.transportation:transportation-driver:[VERSION_NUMBER]' }
Maven
Aggiungi il seguente codice a
pom.xml
:<dependencies> ... <dependency> <groupId>com.google.android.libraries.mapsplatform.transportation.driver</groupId> <artifactId>transportation-driver</artifactId> <version>[VERSION_NUMBER]</version> </dependency> </dependencies>
L'SDK Driver dipende dall'SDK di navigazione e questa dipendenza è configurata in un in modo che, se è necessaria una versione specifica dell'SDK di navigazione, esplicitamente definito nel file di configurazione della build, come riportato di seguito, ometti il blocco di codice menzionato, il progetto potrà sempre scaricare all'ultima versione dell'SDK di navigazione all'interno della versione di release principale. Tieni presente che i comportamenti combinati delle ultime versioni dell'SDK Driver e L'SDK di navigazione è stato sottoposto a test rigorosi prima delle release.
Organizza la configurazione delle dipendenze per lo sviluppo e la release ambienti di lavoro di conseguenza.
Gradle
Aggiungi il seguente codice a
build.gradle
:dependencies { ... implementation 'com.google.android.libraries.navigation:navigation:5.0.0' }
Maven
Aggiungi il seguente codice a
pom.xml
:<dependencies> ... <dependency> <groupId>com.google.android.libraries.navigation</groupId> <artifactId>navigation</artifactId> <version>5.0.0</version> </dependency> </dependencies>
Aggiungi la chiave API all'app
Dopo aver aggiunto l'SDK Driver all'app, aggiungi la chiave API all'app. Tu devi usare la chiave API del progetto che hai ottenuto configurare il progetto di sviluppo.
Questa sezione descrive come archiviare la chiave API in modo che possa essere
a cui fa riferimento la tua app. Non dovresti controllare la tua versione della chiave API
di controllo dei dati. Dovrebbe essere archiviato nel file local.properties
, che è
nella directory radice del progetto. Per ulteriori informazioni
local.properties
file, vedi
File delle proprietà di Gradle.
Per semplificare questa attività, utilizza plug-in Secrets Gradle per Android. Segui questa procedura per installare il plug-in Secrets Gradle e per archiviarli in modo sicuro la chiave API.
Apri il file
build.gradle
a livello di directory principale e aggiungi il seguente codice alla Elementodependencies
inbuildscript
.Trendy
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") } }
Apri il file
build.gradle
a livello di app e aggiungi il seguente codice alla Elementoplugins
.Trendy
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
Kotlin
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
Apri
local.properties
nella directory a livello di progetto, quindi aggiungi seguire il codice. Assicurati di sostituireYOUR_API_KEY
con la tua chiave API.MAPS_API_KEY=YOUR_API_KEY
Nel file
AndroidManifest.xml
, vai acom.google.android.geo.API_KEY
e aggiorna l'attributoandroid:value
come segue:<meta-data android:name="com.google.android.geo.API_KEY" android:value="${MAPS_API_KEY}" />
L'esempio seguente mostra un manifest completo per un'app di esempio:
<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>
Includi le attribuzioni richieste nella tua app
Se utilizzi l'SDK Driver nella tua app, devi includere testo di attribuzione e licenze open source nell'ambito delle note legali dell'app . È meglio includere le attribuzioni come voce di menu indipendente o come di una voce di menu Informazioni.
Le informazioni sulle licenze sono disponibili nel file "third_party_licenses.txt" file in del file AAR non archiviato.
Visita la pagina https://developers.google.com/android/guides/opensource su come includere avvisi open source.
Dipendenze
L'SDK Driver utilizza Da gRPC a per comunicare con il server Fleet Engine. Se non trasferisci già gRPC, potrebbe dover dichiarare le seguenti dipendenze:
dependencies {
implementation 'io.grpc:grpc-android:1.12.0'
implementation 'io.grpc:grpc-okhttp:1.12.0'
}
Senza queste dipendenze, l'SDK driver potrebbe rilevare errori in fase di runtime durante il tentativo di comunicare con il server Fleet Engine.
Se utilizzi ProGuard per ottimizzare le build, potresti dover aggiungere le seguenti righe a ProGuard di configurazione del deployment:
-dontwarn com.google.**
-dontwarn io.grpc.**
-dontwarn okio.**
Il livello API minimo supportato è 23.
Inizializzare l'SDK
Per eseguire l'operazione, è necessario un ID provider (di solito l'ID progetto Google Cloud)
inizializza l'oggetto DriverContext
. Per ulteriori dettagli sulla configurazione
progetto Google Cloud, consulta
Autenticazione e autorizzazione.
Prima di utilizzare l'SDK driver, devi inizializzare l'SDK di navigazione. Per inizializzare l'SDK:
Ottieni un oggetto
Navigator
daNavigationApi
.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 oggetto
DriverContext
e compila i campi obbligatori.DriverContext driverContext = DriverContext.builder(application) .setProviderId(providerId) .setVehicleId(vehicleId) .setAuthTokenFactory(authTokenFactory) .setNavigator(navigator) .setRoadSnappedLocationProvider( NavigationApi.getRoadSnappedLocationProvider(application)) .build();
Utilizza l'oggetto
DriverContext
per inizializzare*DriverApi
.DeliveryDriverApi driverApi = DeliveryDriverApi.createInstance(driverContext);
Ottieni
DeliveryVehicleReporter
dall'oggetto API. (DeliveryVehicleReporter
estendeNavigationVehicleReporter
.)DeliveryVehicleReporter vehicleReporter = driverApi.getDeliveryVehicleReporter();
Autenticazione con AuthTokenFactory
Quando l'SDK Driver genera aggiornamenti della posizione,
deve inviare questi aggiornamenti
il server Fleet Engine. Per autenticare queste richieste,
L'SDK del driver chiama un utente fornito dal chiamante
di AuthTokenFactory
.
La fabbrica è responsabile della generazione dei token di autenticazione presso la sede
aggiornare l'ora.
La modalità con cui vengono generati i token è specifica per la situazione di ogni sviluppatore. Tuttavia, l'implementazione probabilmente deve:
- Recuperare un token di autenticazione, possibilmente in formato JSON, da un server HTTPS
- analizza e memorizza nella cache il token
- aggiorna il token alla scadenza
Per maggiori dettagli sui token previsti dal server Fleet Engine, consulta Creazione di un token JWT (JSON Web Token) per l'autorizzazione.
Ecco uno schema di implementazione di 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);
}
}
}
Questa particolare implementazione utilizza il client HTTP Java integrato per recuperare un in formato JSON dal server di autenticazione dello sviluppatore. Il token è salvate per essere riutilizzate. Il token viene recuperato se il vecchio token rientra tra 10 minuti dalla data di scadenza.
La tua implementazione potrebbe fare le cose in modo diverso, ad esempio utilizzare un thread in background per aggiornare i token.
Le eccezioni in AuthTokenFactory
vengono trattate come temporanee, a meno che non si verifichino
ripetutamente. Dopo una serie di tentativi, l'SDK Driver
presuppone che l'errore sia permanente e smette di tentare di inviare aggiornamenti.
Segnalazione di stato ed errori con StatusListener
Poiché l'SDK dei driver esegue azioni
in background, usa StatusListener
per attivare notifiche quando
al verificarsi di determinati eventi, ad esempio errori, avvisi o messaggi di debug. Gli errori potrebbero essere
di natura temporanea (ad esempio BACKEND_CONNECTIVITY_ERROR
) oppure potrebbero
causano l'interruzione definitiva degli aggiornamenti della posizione (ad esempio VEHICLE_NOT_FOUND
,
che indica un errore di configurazione).
Fornisci un'implementazione facoltativa di tipo StatusListener
, come la seguente:
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.
}
}
Note su SSL/TLS
Internamente, l'implementazione dell'SDK del driver utilizza
SSL/TLS per comunicare in modo sicuro con il server Fleet Engine. Versioni precedenti
di Android (versione API 23 o
precedenti) potrebbe richiedere una patch SecurityProvider
per comunicare
o server web. Per ulteriori informazioni sull'uso di SSL in Android, vedi
Provider GMS di sicurezza.
L'articolo contiene anche esempi di codice per l'applicazione di patch al provider di sicurezza.
Attiva aggiornamenti posizione
Una volta ottenuta un'istanza *VehicleReporter
, l'abilitazione degli aggiornamenti della posizione
semplice:
DeliveryVehicleReporter reporter = ...;
reporter.enableLocationTracking();
Se possibile, gli aggiornamenti della posizione vengono inviati a intervalli regolari. Ogni località "Aggiorna anche" che il veicolo è online.
Per impostazione predefinita, l'intervallo del report è di 10 secondi. Puoi modificare i report
intervallo con reporter.setLocationReportingInterval(long, TimeUnit)
. La
l'intervallo di aggiornamento minimo supportato è di 5 secondi. Aggiornamenti più frequenti possono
il che comporta richieste ed errori più lenti.
Disattivare gli aggiornamenti della posizione
Al termine del turno del conducente, puoi interrompere gli aggiornamenti sulla posizione chiamando
DeliveryVehicleReporter.disableLocationTracking
.
Casi d'uso di modelli attendibili
Questa sezione descrive come utilizzare l'SDK Driver per implementare casi d'uso comuni quando utilizzi il modello attendibile.
Crea un veicolo
Puoi creare un veicolo dall'SDK Driver.
Prima di creare un veicolo, assicurati di inizializzare l'API Delivery Driver. L'ID veicolo deve essere creato con l'ID veicolo e fornitore utilizzati durante l'inizializzazione dell'SDK del driver. Poi crea il veicolo come mostrato nel seguente esempio:
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleManager vehicleManager = api.getDeliveryVehicleManager();
try {
DeliveryVehicle vehicle = vehicleManager.createVehicle().get();
// Handle CreateVehicleRequest DeliveryVehicle response.
} catch (Exception e) {
// Handle CreateVehicleRequest error.
}
Crea un'attività di ritiro della spedizione
Puoi creare un'attività di ritiro della spedizione dall'SDK Driver.
Prima di creare un'attività, assicurati di inizializzare l'API Delivery Driver. L'attività deve essere creata utilizzando l'ID provider specificato durante l'SDK Driver durante l'inizializzazione. Quindi crea l'attività di ritiro della spedizione come mostrato di seguito esempio. Per informazioni sugli ID attività, consulta Esempi di ID attività.
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.
}
Creare un'attività di consegna della spedizione
Puoi creare un'attività di consegna della spedizione dall'SDK Driver.
Prima di creare un'attività, assicurati di inizializzare l'API Delivery Driver. Quindi crea l'attività di consegna della spedizione come mostrato nell'esempio seguente. Per informazioni sugli ID attività, consulta Esempi di ID attività.
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à pianificata
Puoi creare un'attività per indicare l'indisponibilità (ad esempio, per il conducente rotte o rifornimento del veicolo) dall'SDK Driver. Un'indisponibilità pianificata non deve includere un ID monitoraggio. Se vuoi, puoi fornire una località.
Prima di creare un'attività, assicurati di inizializzare l'API Delivery Driver. Quindi, crea l'attività di indisponibilità come mostrato nell'esempio seguente. Per informazioni sugli ID attività, consulta Esempi di ID attività.
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.
}
Fermate programmate
Puoi creare un'attività di interruzione pianificata tramite l'SDK Driver. Un file programmato l'attività di interruzione potrebbe non includere un ID monitoraggio.
Prima di creare un'attività, assicurati di inizializzare l'API Delivery Driver. Quindi crea l'attività di interruzione pianificata come mostrato nell'esempio seguente. Per informazioni sugli ID attività, consulta Esempi di ID attività.
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.
}
Aggiorna l'ordine delle attività
Puoi aggiornare l'ordine di esecuzione delle attività assegnate a un veicolo dalla SDK driver.
L'aggiornamento dell'ordine delle attività assegna anche attività a un veicolo se non lo erano assegnate in precedenza a un veicolo. Chiude anche le attività che in precedenza erano assegnati a un veicolo e sono stati esclusi dall'ordine aggiornato. L'assegnazione di un a un altro veicolo se era stata precedentemente assegnata a un altro veicolo genera un errore. Prima di assegnare un'attività al nuovo veicolo, chiudi l'attività esistente e ne crei una nuova.
Puoi aggiornare l'ordine delle attività in qualsiasi momento.
Prima di aggiornare l'ordine delle attività per un veicolo, assicurati che il veicolo e sono già state create in Fleet Engine. Quindi, aggiorna l'ordine delle attività del veicolo, come mostrato nell'esempio seguente.
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.
}
Potrebbe verificarsi un'eccezione che potrebbe impedire un aggiornamento
allo stato interno dell'SDK del driver. In questo caso, risolvi il problema e
chiama di nuovo setVehicleStops
finché la chiamata non va a buon fine.
I potenziali problemi possono includere:
I VehicleStop specificati non seguono un pattern valido. Solo il primo VehicleStop può essere in uno qualsiasi dei VehicleStopState: NEW, ENROUTE o ARRIVED. Il valore VehicleStops dopo l'arresto attuale deve essere nel NUOVO VehicleStopState.
Le attività non esistono o appartengono a un altro veicolo.
Il veicolo non esiste.
Il veicolo è in viaggio verso la prossima fermata
Fleet Engine deve essere avvisata quando un veicolo parte da una fermata e avvia la navigazione. Puoi inviare una notifica a Fleet Engine dall'SDK Driver.
Prima di notificare a Fleet Engine che un veicolo è partito da una fermata, le fermate del veicolo sono state create e impostate. Quindi, comunica a Fleet Engine del veicolo, come mostrato nell'esempio seguente.
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.
}
Potrebbe verificarsi un'eccezione che potrebbe impedire un aggiornamento dell'SDK
stato interno. In questo caso, risolvi il problema e chiama
enrouteToNextStop
di nuovo finché l'operazione non riesce.
I potenziali problemi possono includere:
- Nessun elemento
VehicleStops
rimanente impostato nell'SDK Driver.
Il veicolo arriva a una fermata
Fleet Engine deve essere avvisata quando un veicolo arriva a una fermata. Puoi inviare una notifica a Fleet Engine dall'SDK Driver.
Prima di comunicare a Fleet Engine che un veicolo è arrivato a una fermata, del veicolo sono state impostate. Quindi comunica a Fleet Engine l'arrivo del veicolo alla fermata, come mostrato nell'esempio seguente.
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.
}
È possibile che si verifichi un'eccezione che potrebbe impedire un aggiornamento del traffico interno
stato. In questo caso, risolvi il problema e chiama di nuovo arrivedAtStop
.
fino a quando non avrà esito positivo.
I potenziali problemi potrebbero includere:
- Nessun elemento
VehicleStops
rimanente impostato nell'SDK Driver.
Il veicolo completa una fermata
Devi informare Fleet Engine quando un veicolo si ferma. Questa notifica fa sì che tutte le attività associate alla fermata vengano impostate sullo stato CHIUSA. Puoi inviare una notifica a Fleet Engine dall'SDK Driver.
Comunica a Fleet Engine che il veicolo ha completato il veicoloStop come mostrato in nell'esempio che segue.
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.
}
È possibile che si verifichi un'eccezione che potrebbe impedire un aggiornamento del traffico interno
stato. In questo caso, risolvi il problema e chiama di nuovo completedStop
.
fino a quando non avrà esito positivo.
I potenziali problemi possono includere:
- Nessun elemento
VehicleStops
rimanente impostato nell'SDK Driver.
Chiudere un'attività
Per chiudere un'attività assegnata a un veicolo, invia una notifica a Fleet Engine che il veicolo ha completato la fermata dove si svolge l'attività, o rimuoverla dall'elenco delle fermate. Per farlo, puoi impostare l'elenco il veicolo rimanente si ferma esattamente come aggiornando l'ordine delle attività per un veicolo.
Se un'attività non è ancora stata assegnata a un veicolo e deve essere chiusa, aggiorna il sullo stato CHIUSA. Tuttavia, non puoi riaprire un'attività CHIUSA.
La chiusura di un'attività non indica se l'attività è riuscita o meno. Indica che l'attività non è più considerata in corso. Per il monitoraggio della spedizione, è importante indicano il risultato effettivo di un'attività in modo da poter mostrare l'esito della consegna.
Per poter utilizzare l'SDK Driver, è necessario assegnare un'attività a un veicolo per chiudere l'attività. Per chiudere un'attività assegnata a un veicolo, invia una notifica Fleet Engine che indica che il veicolo ha completato la fermata dove si svolge l'attività.
In alternativa, aggiorna l'ordine delle attività del veicolo a cui è assegnata l'attività, quindi rimuovila dall'elenco viene interrotto.
Imposta l'esito dell'attività e la località dei risultati
La chiusura di un'attività non indica se l'attività è riuscita o meno. Indica che l'attività non è più considerata in corso. Per il monitoraggio della spedizione, è importante indicare il risultato effettivo di un'attività in modo da poter mostrare l'esito dell'attività. che la fatturazione per i servizi sia corretta. Una volta impostata, non puoi più modificare l'esito di un'attività. ma puoi modificare l'ora e la posizione dei risultati delle attività dopo averle impostate.
I risultati delle attività che si trovano in stato CHIUSO possono essere impostati su RIUSCITA o NON RIUSCITA. Fleet Engine addebita solo le attività di consegna con lo stato RIUSCITA.
Quando contrassegna il risultato di un'attività, Fleet Engine compila automaticamente posizione dei risultati dell'attività con l'ultima posizione nota del veicolo. Puoi eseguire l'override questo comportamento.
L'esempio seguente mostra come utilizzare l'SDK Driver per impostare il risultato di un'attività e timestamp. Non puoi impostare la località dei risultati delle attività utilizzando l'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.
}
Cerca un veicolo
Puoi cercare un veicolo dall'SDK Driver. Prima di cercare un veicolo, assicurati di inizializzare l'API Delivery Driver. Puoi quindi cercare il veicolo come mostrato nell'esempio seguente.
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
può cercare solo DeliveryVehicle
per l'ID veicolo fornito durante l'inizializzazione dell'API Delivery Driver.