Last Mile Fleet Solution ist derzeit nur für ausgewählte Kunden verfügbar. Weitere Informationen erhalten Sie vom Vertrieb.

Erste Schritte mit dem Driver SDK für Android

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Mindestsystemanforderungen

Auf dem Mobilgerät muss Android 5.0 (API-Level 21) oder höher installiert sein.

Voraussetzungen

In diesem Leitfaden wird davon ausgegangen, dass das Navigation SDK bereits in Ihrer App implementiert ist und das Fleet Engine-Back-End eingerichtet und verfügbar ist.

Das Driver SDK for Android wird in einem Maven-Repository für Artifact Registry veröffentlicht. Das Repository enthält die SDK-Dateien für Projektobjekte (.pom) und Offline-Javadocs.

Zugang erhalten

Wenn Sie Google Workspace-Kunde sind, erstellen Sie während der Einrichtung eine Workspace-Gruppe wie google-maps-platform-sdk-users@workspacedomain.com und geben Sie den Namen an Google weiter. Dies ist der empfohlene Ansatz. Ihre Arbeitsbereichsgruppe wird dann einer Zulassungsliste hinzugefügt, die Zugriff auf das Maven-Repository gmp-artifacts/transportation gewährt. Prüfen Sie, ob die E-Mail-Adressen der Nutzer und Dienstkonten, die Zugriff benötigen, in dieser Liste enthalten sind.

Wenn Ihre Organisation keine Workspace-Gruppen erstellen kann, senden Sie eine Liste der E-Mail-Adressen von Nutzern und Dienstkonten, die Zugriff auf diese Artefakte benötigen, an Google.

Lokale Entwicklung

Für die lokale Entwicklung reicht es aus, sich mit dem Cloud SDK anzumelden.

gcloud

gcloud auth login

Die für die Anmeldung verwendete E-Mail-Adresse muss Mitglied der Workspace-Gruppe sein.

Automatisierung (Systemerstellung oder kontinuierliche Integration)

Richten Sie Ihre Automatisierungshosts gemäß den Best Practices ein:

  • Wenn der Prozess in einer Google Cloud-Umgebung ausgeführt wird, nutzen Sie die automatische Erkennung von Anmeldedaten.

  • Andernfalls speichern Sie die Schlüsseldatei des Dienstkontos an einem sicheren Ort im Dateisystem des Hosts und legen Sie die Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS entsprechend fest.

Die E-Mail-Adresse des Dienstkontos, das mit den Anmeldedaten verknüpft ist, muss Mitglied der Workspace-Gruppe sein.

Konfiguration

Konfigurieren Sie Maven oder Gradle so, dass Nutzer- oder Dienstanmeldedaten automatisch erkannt werden.

Gradle

Fügen Sie der Datei build.gradle Ihres Anwendungsmoduls Folgendes hinzu, nicht der Datei build.gradle des Projektstammmoduls:

  plugins {
    id "com.google.cloud.artifactregistry.gradle-plugin" version "2.1.5"
  }
  repositories {
    maven {
      url "artifactregistry://us-west2-maven.pkg.dev/gmp-artifacts/transportation"
    }
  }

Maven

Fügen Sie zum pom.xml Folgendes hinzu:

  <repositories>
    <repository>
      <id>gmp-artifacts</id>
      <url>artifactregistry://us-west2-maven.pkg.dev/gmp-artifacts/transportation</url>
      <releases>
        <enabled>true</enabled>
      </releases>
    </repository>
  </repositories>
  <build>
    <extensions>
      <extension>
        <groupId>com.google.cloud.artifactregistry</groupId>
        <artifactId>artifactregistry-maven-wagon</artifactId>
        <version>2.1.0</version>
      </extension>
    </extensions>
  </build>

Informationen zum Überprüfen des Zugriffs finden Sie unter Java-Pakete verwalten.

Projektkonfiguration

Ihre App muss auf minSdkVersion 21 oder höher ausgerichtet sein, um das Driver SDK zu verwenden. Weitere Informationen finden Sie unter Versionshinweise.

Zum Ausführen einer mit dem Driver SDK erstellten App müssen auf dem Android-Gerät Google Play-Dienste installiert sein.

Entwicklungsprojekt einrichten

So richten Sie Ihr Entwicklungsprojekt ein und rufen einen API-Schlüssel für das Projekt in der Google Cloud Console ab:

  1. Erstellen Sie ein neues Google Cloud Console-Projekt oder wählen Sie ein vorhandenes Projekt für die Verwendung mit dem Driver SDK aus. Warten Sie einige Minuten, bis das neue Projekt in der Google Cloud Console sichtbar ist.

  2. Damit Sie die Demo-App ausführen können, muss Ihr Projekt Zugriff auf das Maps SDK for Android haben. Wählen Sie in der Google Cloud Console APIs und Dienste & gt; Bibliothek aus und suchen Sie dann nach dem Maps SDK for Android und aktivieren Sie es.

  3. Rufen Sie einen API-Schlüssel für das Projekt ab, indem Sie APIs und Dienste > Anmeldedaten > Anmeldedaten erstellen > API-Schlüssel auswählen. Weitere Informationen zum Abrufen eines API-Schlüssels finden Sie unter API-Schlüssel abrufen.

Driver SDK zur App hinzufügen

Das Driver SDK ist über ein privates Maven-Repository verfügbar. Das Repository enthält die Projektobjektmodell-Dateien (.pom) des SDK und Javadocs. So fügen Sie das Treiber-SDK Ihrer App hinzu:

  1. Richten Sie Ihre Umgebung für den Zugriff auf das Maven-Host-Repository ein, wie im Abschnitt zur Konfiguration beschrieben.

  2. Fügen Sie der Gradle- oder Maven-Konfiguration die folgende Abhängigkeit hinzu. Ersetzen Sie dabei den Platzhalter VERSION_NUMBER durch die gewünschte Version des Driver SDK.

    Gradle

    Fügen Sie zum build.gradle Folgendes hinzu:

    dependencies {
      ...
      implementation 'com.google.android.libraries.mapsplatform.transportation:transportation-driver:[VERSION_NUMBER]'
    }
    

    Maven

    Fügen Sie zum pom.xml Folgendes hinzu:

    <dependencies>
      ...
      <dependency>
        <groupId>com.google.android.libraries.mapsplatform.transportation.driver</groupId>
        <artifactId>transportation-driver</artifactId>
        <version>[VERSION_NUMBER]</version>
      </dependency>
    </dependencies>
    

API-Schlüssel in App einfügen

Fügen Sie den API-Schlüssel in Ihre Anwendung ein, nachdem Sie das Driver SDK hinzugefügt haben. Sie müssen den Projekt-API-Schlüssel verwenden, den Sie beim Einrichten Ihres Entwicklungsprojekts erhalten haben.

In diesem Abschnitt wird beschrieben, wie du deinen API-Schlüssel speicherst, damit er von deiner App sicherer referenziert werden kann. Er sollte nicht in dein Versionsverwaltungssystem eingecheckt werden. Sie sollte in der Datei local.properties gespeichert sein, die sich im Stammverzeichnis Ihres Projekts befindet. Weitere Informationen zur Datei local.properties finden Sie unter Gradle-Attributdateien.

Verwenden Sie zum Optimieren dieser Aufgabe das Secrets Gradle-Plug-in für Android. Folgen Sie dieser Anleitung, um das Secrets Gradle-Plug-in zu installieren und Ihren API-Schlüssel sicher zu speichern.

  1. Öffnen Sie die Datei build.gradle auf Stammebene und fügen Sie dem Element dependencies unter buildscript den folgenden Code hinzu.

    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")
        }
    }
    
  2. Öffnen Sie die Datei build.gradle auf App-Ebene und fügen Sie dem Element plugins den folgenden Code hinzu.

    Groovy

    id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
    

    Kotlin

    id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
    
  3. Synchronisieren Sie Ihr Projekt mit Gradle.

  4. Öffnen Sie local.properties im Verzeichnis auf Projektebene und fügen Sie dann den folgenden Code hinzu. Ersetzen Sie YOUR_API_KEY durch Ihren API-Schlüssel.

    MAPS_API_KEY=YOUR_API_KEY
    
  5. Rufen Sie in der Datei AndroidManifest.xml com.google.android.geo.API_KEY auf und aktualisieren Sie das Attribut android:value so:

    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="${MAPS_API_KEY}" />
    

Das folgende Beispiel zeigt ein vollständiges Manifest für eine Beispielanwendung:

<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>

Erforderliche Attributionen in die App aufnehmen

Wenn Sie das Driver SDK in Ihrer App verwenden, müssen Sie im Abschnitt „Rechtliche Hinweise“ Ihrer App Attributionstext und Open-Source-Lizenzen angeben. Am besten fügen Sie die Quellenangaben als eigenständiges Menüelement oder als Teil eines Info-Menüelements hinzu.

Sie finden den erforderlichen Attributionstext und die Open-Source-Lizenzen in der ZIP-Datei Driver SDK:

  • NOTICE.txt
  • LICENSES.txt

Abhängigkeiten

Das Driver SDK verwendet gRPC, um mit dem Fleet Engine-Server zu kommunizieren. Wenn Sie gRPC noch nicht verwenden, müssen Sie möglicherweise die folgenden Abhängigkeiten deklarieren:

dependencies {
    implementation 'io.grpc:grpc-android:1.12.0'
    implementation 'io.grpc:grpc-okhttp:1.12.0'
}

Ohne diese Abhängigkeiten kann das Driver SDK bei der Kommunikation mit dem Fleet Engine-Server zur Laufzeit Fehler erhalten.

Wenn Sie Ihre Builds mit ProGuard optimieren, müssen Sie der ProGuard-Konfigurationsdatei möglicherweise die folgenden Zeilen hinzufügen:

-dontwarn com.google.**
-dontwarn io.grpc.**
-dontwarn okio.**

Die mindestens unterstützte API-Ebene ist 21.

SDK initialisieren

Zum Initialisieren des DriverContext-Objekts wird eine Anbieter-ID benötigt (in der Regel die Google Cloud-Projekt-ID). Weitere Informationen zum Einrichten des Google Cloud-Projekts finden Sie unter Authentifizierung und Autorisierung.

Bevor Sie das Driver SDK verwenden können, müssen Sie zuerst das Navigation SDK initialisieren. So initialisieren Sie das SDK:

  1. Rufen Sie ein Navigator-Objekt aus dem NavigationApi ab.

    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;
          }
        }
    );
    
  2. Erstellen Sie ein DriverContext-Objekt und füllen Sie die Pflichtfelder aus.

    DriverContext driverContext = DriverContext.builder(application)
        .setProviderId(providerId)
        .setVehicleId(vehicleId)
        .setAuthTokenFactory(authTokenFactory)
        .setNavigator(navigator)
        .setRoadSnappedLocationProvider(
            NavigationApi.getRoadSnappedLocationProvider(application))
        .build();
    
  3. Verwenden Sie das Objekt DriverContext, um *DriverApi zu initialisieren.

    DeliveryDriverApi driverApi = DeliveryDriverApi.createInstance(driverContext);
    
  4. Rufen Sie DeliveryVehicleReporter aus dem API-Objekt ab. (DeliveryVehicleReporter erweitert NavigationVehicleReporter.)

    DeliveryVehicleReporter vehicleReporter = driverApi.getDeliveryVehicleReporter();
    

Mit AuthTokenFactory authentifizieren

Wenn das Driver SDK Standortupdates generiert, muss es diese Aktualisierungen an den Fleet Engine-Server senden. Zur Authentifizierung dieser Anfragen ruft das Driver SDK eine vom Aufrufer bereitgestellte Instanz von AuthTokenFactory ab. Die Factory ist zum Generieren von Authentifizierungstokens zum Zeitpunkt der Standortaktualisierung zuständig.

Wie genau Tokens generiert werden, hängt von der Situation des jeweiligen Entwicklers ab. Die Implementierung muss jedoch wahrscheinlich Folgendes tun:

  • Authentifizierungstoken, möglicherweise im JSON-Format, von einem HTTPS-Server abrufen
  • Token parsen und im Cache speichern
  • Token aktualisieren, wenn es abläuft

Weitere Informationen zu den vom Fleet Engine-Server erwarteten Tokens finden Sie unter JSON-Webtoken (JWT) für die Autorisierung erstellen.

Dies ist ein grundlegendes Implementieren eines 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);
    }
  }
}

Diese spezielle Implementierung verwendet den integrierten Java-HTTP-Client, um ein Token im JSON-Format vom Authentifizierungsserver des Entwicklers abzurufen. Das Token wird zur Wiederverwendung gespeichert. Das Token wird noch einmal abgerufen, wenn das alte Token innerhalb von zehn Minuten nach Ablauf der Ablaufzeit liegt.

Ihre Implementierung kann andere Aktionen ausführen, z. B. ein Hintergrundthread zum Aktualisieren von Tokens.

Ausnahmen werden in AuthTokenFactory als vorübergehend behandelt, es sei denn, sie treten wiederholt auf. Nach mehreren Versuchen geht das Driver SDK davon aus, dass der Fehler dauerhaft ist, und versucht nicht mehr, Updates zu senden.

Status- und Fehlerberichte für StatusListener

Da das Driver SDK im Hintergrund Aktionen ausführt, können Sie StatusListener verwenden, um Benachrichtigungen auszulösen, wenn bestimmte Ereignisse auftreten, z. B. Fehler, Warnungen oder Meldungen zur Fehlerbehebung. Fehler können vorübergehend sein (z. B. BACKEND_CONNECTIVITY_ERROR) oder dazu führen, dass Standortupdates dauerhaft beendet werden (z. B. VEHICLE_NOT_FOUND, was einen Konfigurationsfehler anzeigt).

Sie können eine optionale StatusListener-Implementierung angeben:

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.
  }
}

Hinweise zu SSL/TLS

Die Driver SDK-Implementierung verwendet intern SSL/TLS für die sichere Kommunikation mit dem Fleet Engine-Server. Ältere Versionen von Android (API-Versionen 21 oder niedriger) benötigen möglicherweise einen SecurityProvider-Patch, um mit dem Server kommunizieren zu können. Weitere Informationen zur Verwendung von SSL in Android finden Sie in diesem Artikel. Der Artikel enthält auch Codebeispiele zum Patchen des Sicherheitsanbieters.

Standortupdates aktivieren

Sobald Sie eine *VehicleReporter-Instanz haben, ist das Aktivieren von Standortupdates ganz einfach:

DeliveryVehicleReporter reporter = ...;

reporter.enableLocationTracking();

Standortaktualisierungen werden, soweit möglich, regelmäßig gesendet. Bei jeder Standortaktualisierung wird außerdem angezeigt, dass das Fahrzeug online ist.

Standardmäßig beträgt das Intervall für Berichte 10 Sekunden. Das Berichtsintervall kann mit reporter.setLocationReportingInterval(long, TimeUnit) geändert werden. Das mindestens unterstützte Updateintervall beträgt 5 Sekunden. Häufigere Updates können zu längeren Anfragen und Fehlern führen.

Standortupdates werden deaktiviert

Wenn der Fahrwechsel abgeschlossen ist, können Standortaktualisierungen durch Aufrufen von DeliveryVehicleReporter.disableLocationTracking beendet werden.

Anwendungsfälle für vertrauenswürdige Modelle

In diesem Abschnitt wird beschrieben, wie Sie mit dem Driver SDK gängige Anwendungsfälle für das vertrauenswürdige Modell implementieren.

Fahrzeug erstellen

Sie können ein Fahrzeug aus dem Driver SDK erstellen.

Bevor Sie ein Fahrzeug erstellen, müssen Sie die Delivery Driver API initialisieren. Die Fahrzeug-ID muss mit der Fahrzeug- und Anbieter-ID erstellt werden, die bei der Initialisierung des Driver SDK verwendet wird. Erstellen Sie dann das Fahrzeug wie im folgenden Beispiel:

DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleManager vehicleManager = api.getDeliveryVehicleManager();
try {
  DeliveryVehicle vehicle = vehicleManager.createVehicle().get();
  // Handle CreateVehicleRequest DeliveryVehicle response.
} catch (Exception e) {
  // Handle CreateVehicleRequest error.
}

Aufgabe zum Abholen einer Lieferung erstellen

Sie können über das Driver SDK eine Aufgabe zur Abholung des Versands erstellen.

Bevor Sie eine Aufgabe erstellen, müssen Sie die Delivery Driver API initialisieren. Die Aufgabe muss mit der Anbieter-ID erstellt werden, die Sie bei der Treiber-SDK-Initialisierung angegeben haben. Erstellen Sie dann die Aufgabe für den Versand, wie im folgenden Beispiel gezeigt. Informationen zu Task-IDs finden Sie unter Task ID-Beispiele.

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.
}

Versandaufgabe erstellen

Sie können eine Zustellaufgabe im Driver SDK erstellen.

Bevor Sie eine Aufgabe erstellen, müssen Sie die Delivery Driver API initialisieren. Erstellen Sie dann die Aufgabe für den Versand, wie im folgenden Beispiel gezeigt. Informationen zu Task-IDs finden Sie unter Task ID-Beispiele.

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.
}

Geplante Nichtverfügbarkeit

Sie können über das Driver SDK eine Aufgabe erstellen, die angibt, dass die Bereitstellung nicht möglich ist (z. B. bei einer Pause oder beim Tanken). Eine geplante Nichtverfügbarkeitsaufgabe darf keine Tracking-ID enthalten. Sie können optional einen Standort angeben.

Bevor Sie eine Aufgabe erstellen, müssen Sie die Delivery Driver API initialisieren. Erstellen Sie dann die Aufgabe für die Nichtverfügbarkeit, wie im folgenden Beispiel gezeigt. Informationen zu Task-IDs finden Sie unter Task ID-Beispiele.

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.
}

Geplante Haltestellen

Sie können eine geplante Aufgabe mit dem Driver SDK erstellen. Eine geplante Aufgabe kann keine Tracking-ID enthalten.

Bevor Sie eine Aufgabe erstellen, müssen Sie die Delivery Driver API initialisieren. Erstellen Sie dann die geplante Stoppaufgabe, wie im folgenden Beispiel gezeigt. Informationen zu Task-IDs finden Sie unter Task ID-Beispiele.

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.
}

Aufgabenreihenfolge aktualisieren

Sie können die Reihenfolge der Ausführung von Aufgaben, die einem Fahrzeug zugewiesen sind, über das Driver SDK aktualisieren.

Durch das Aktualisieren der Aufgabenreihenfolge werden einem Fahrzeug auch Aufgaben zugewiesen, die zuvor noch keinem Fahrzeug zugewiesen waren. Außerdem werden Aufgaben geschlossen, die zuvor einem Fahrzeug zugewiesen waren und bei der die neue Reihenfolge ausgelassen wurde. Wenn eine Aufgabe einem anderen Fahrzeug zugewiesen wird, wenn sie zuvor einem anderen Fahrzeug zugewiesen war, wird ein Fehler generiert. Bevor Sie dem neuen Fahrzeug eine Aufgabe zuweisen, schließen Sie die vorhandene Aufgabe und erstellen Sie eine neue Aufgabe.

Sie können die Reihenfolge der Aufgaben jederzeit aktualisieren.

Bevor Sie die Aufgabenreihenfolge für ein Fahrzeug aktualisieren, prüfen Sie, ob das Fahrzeug und die Aufgaben bereits in Fleet Engine erstellt wurden. Aktualisieren Sie dann die Aufgabenreihenfolge für das Fahrzeug, wie im folgenden Beispiel gezeigt.

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.
}

Eine Ausnahme könnte auftreten, wenn eine Aktualisierung des internen Status des Driver SDK verhindert werden könnte. Lösen Sie in diesem Fall das Problem und rufen Sie setVehicleStops noch einmal auf, bis der Aufruf erfolgreich war.

Beispiele für mögliche Probleme:

  • Die angegebenen VehicleStops weisen kein gültiges Muster auf. Nur der erste VehicleStop kann einen der folgenden VehicleStop-Status haben: NEW, ENROUTE oder ARRIVED. VehicleStops nach der aktuellen Haltestelle müssen sich im NEW VehicleStopState befinden.

  • Aufgaben sind entweder nicht vorhanden oder gehören zu einem anderen Fahrzeug.

  • Das Fahrzeug ist nicht vorhanden.

Das Fahrzeug ist unterwegs zur nächsten Haltestelle

Die Fleet Engine muss benachrichtigt werden, wenn ein Fahrzeug von einer Haltestelle abfährt und die Navigation beginnt. Sie können die Fleet Engine über das Driver SDK benachrichtigen.

Bevor Sie die Fleet Engine darüber informieren, dass ein Fahrzeug von einer Haltestelle abgefahren ist, sollten Sie prüfen, ob die Fahrzeugstopps erstellt und festgelegt wurden. Benachrichtigen Sie dann die Fleet Engine über die Abfahrt des Fahrzeugs, wie im folgenden Beispiel gezeigt.

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 kann eine Ausnahme geben, die eine Aktualisierung des internen Status des Driver SDK verhindert. In diesem Fall sollten Sie das Problem beheben und enrouteToNextStop noch einmal aufrufen, bis der Vorgang erfolgreich war.

Beispiele für mögliche Probleme:

  • Keine verbleibenden VehicleStops im Driver SDK festgelegt.

Das Fahrzeug kommt an einer Haltestelle an

Die Fleet Engine muss benachrichtigt werden, wenn ein Fahrzeug an einer Haltestelle ankommt. Sie können Fleet Engine über das Driver SDK benachrichtigen.

Bevor Sie die Fleet Engine darüber informieren, dass ein Fahrzeug an einer Haltestelle eingetroffen ist, prüfen Sie, ob die Fahrzeugstopps festgelegt wurden. Benachrichtigen Sie dann die Fleet Engine über die Ankunft des Fahrzeugs an der Haltestelle, wie im folgenden Beispiel gezeigt.

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.
}

Eine Ausnahme kann dazu führen, dass eine Aktualisierung des internen Status des Driver SDK verhindert wird. In diesem Fall sollten Sie das Problem beheben und arrivedAtStop noch einmal aufrufen, bis der Vorgang erfolgreich war.

Mögliche Probleme:

  • Keine verbleibenden VehicleStops im Driver SDK festgelegt.

Fahrzeug hält an

Die Fleet Engine muss benachrichtigt werden, wenn ein Fahrzeug anhält. Dadurch werden alle mit der Haltestelle verknüpften Aufgaben auf den Status „GESCHLOSSEN“ gesetzt. Sie können die Fleet Engine über das Driver SDK benachrichtigen.

Benachrichtigen Sie die Fleet Engine, dass das Fahrzeug seine VehicleStop-Haltestelle abgeschlossen hat, wie im folgenden Beispiel gezeigt.

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.
}

Eine Ausnahme kann dazu führen, dass eine Aktualisierung des internen Status des Driver SDK verhindert wird. In diesem Fall sollten Sie das Problem beheben und completedStop noch einmal aufrufen, bis der Vorgang erfolgreich war.

Beispiele für mögliche Probleme:

  • Keine verbleibenden VehicleStops im Driver SDK festgelegt.

Aufgaben schließen

Wenn Sie eine Aufgabe, die einem Fahrzeug zugewiesen wurde, schließen möchten, benachrichtigen Sie entweder Fleet Engine, dass das Fahrzeug die Haltestelle dort abgeschlossen hat, wo die Aufgabe ausgeführt wird, oder entfernen Sie es aus der Liste der Fahrzeughaltestellen. Dazu können Sie die Liste der verbleibenden Fahrzeughaltestellen genau wie beim Aktualisieren der Aufgabenreihenfolge für ein Fahrzeug festlegen.

Wenn einer Aufgabe noch kein Fahrzeug zugewiesen war und sie geschlossen werden muss, aktualisieren Sie die Aufgabe auf den Status „geschlossen“. Sie können eine abgeschlossene Aufgabe jedoch nicht wieder öffnen.

Das Schließen einer Aufgabe bedeutet nicht, dass der Vorgang erfolgreich war oder fehlgeschlagen ist. Damit wird angegeben, dass die Aufgabe nicht mehr ausgeführt wird. Für die Sendungsverfolgung ist es wichtig, das tatsächliche Ergebnis einer Aufgabe anzugeben, damit ein Lieferergebnis angezeigt werden kann.

Einem Fahrzeug muss eine Aufgabe zugewiesen sein, damit es mit dem Driver SDK geschlossen werden kann. Wenn Sie eine Aufgabe, die einem Fahrzeug zugewiesen wurde, schließen möchten, informieren Sie die Fleet Engine darüber, dass das Fahrzeug an der Haltestelle beendet wurde, an der die Aufgabe ausgeführt wurde.

Alternativ können Sie die Aufgabenreihenfolge des Fahrzeugs aktualisieren, dem die Aufgabe zugewiesen ist, und dann die gewünschte Aufgabe aus der Liste der Haltestellen entfernen.

Aufgabenergebnis und Speicherort für Ergebnisse festlegen

Das Schließen einer Aufgabe bedeutet nicht, dass der Vorgang erfolgreich war oder fehlgeschlagen ist. Damit wird angegeben, dass die Aufgabe nicht mehr ausgeführt wird. Für die Sendungsverfolgung ist es wichtig, das tatsächliche Ergebnis einer Aufgabe anzugeben, damit ein Bereitstellungsergebnis angezeigt werden kann, damit die Dienste ordnungsgemäß abgerechnet werden. Nachdem Sie das Aufgabenergebnis festgelegt haben, können Sie es nicht mehr ändern. Sie können die Zeit und den Ort für das Aufgabenergebnis jedoch ändern, nachdem Sie sie festgelegt haben.

Für Aufgaben im Status „SCHLIEẞEN“ kann das Ergebnis entweder ERFOLGREICH oder FEHLGESCHLAGEN sein. Nur Abhol- und Lieferaufgaben mit dem Status ERFOLGREICH werden in Rechnung gestellt.

Wenn das Ergebnis einer Aufgabe markiert wird, füllt Fleet Engine den Aufgabenergebnisort automatisch mit dem letzten bekannten Fahrzeugstandort aus. Sie können dieses Verhalten überschreiben.

Das folgende Beispiel zeigt, wie Sie mit dem Driver SDK ein Ergebnis und einen Zeitstempel für eine Aufgabe festlegen. Sie können mit dem Driver SDK keinen Speicherort für Aufgabenergebnisse festlegen.

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.
}

Nach Fahrzeug suchen

Sie können ein Fahrzeug über das Driver SDK nachschlagen. Bevor Sie nach einem Fahrzeug suchen, müssen Sie die Delivery Driver API initialisieren. Sie können dann das Fahrzeug wie im folgenden Beispiel nachschlagen.

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 kann nur den DeliveryVehicle für die Fahrzeug-ID abrufen, die während der Initialisierung der Delivery Driver API angegeben wurde.