Erste Schritte mit dem Driver SDK für Android

Mindestsystemanforderungen

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

Build- und Abhängigkeitenkonfiguration

Die Driver SDK-Version 4.99 und höher ist im Google Maven-Repository verfügbar.

Gradle

Füge deiner Datei build.gradle Folgendes hinzu:

repositories {
    ...
    google()
}

Maven

Füge deiner Datei pom.xml Folgendes hinzu:

<project>
  ...
  <repositories>
    <repository>
      <id>google-maven-repository</id>
      <url>https://maven.google.com</url>
    </repository>
  </repositories>
  ...
</project>

Projektkonfiguration

Wenn du das Driver SDK verwenden möchtest, muss deine App auf minSdkVersion 23 oder höher ausgerichtet sein. Weitere Informationen finden Sie in den Versionshinweisen.

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

Entwicklungsprojekt einrichten

So richten Sie in der Google Cloud Console Ihr Entwicklungsprojekt ein und rufen einen API-Schlüssel für das Projekt 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 angezeigt wird.

  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 > Bibliothek aus, suchen Sie nach dem Maps SDK for Android und aktivieren Sie es.

  3. Rufen Sie einen API-Schlüssel für das Projekt ab. Wählen Sie dazu APIs und Dienste > Anmeldedaten > Anmeldedaten erstellen > API-Schlüssel aus. Weitere Informationen

Treiber SDK zur App hinzufügen

Das Driver SDK ist im Google Maven-Repository verfügbar. Das Repository enthält die Project Object Model-Dateien (pom) des SDK und Javadocs. So fügen Sie Ihrer App das Driver SDK hinzu:

  1. Fügen Sie Ihrer Gradle- oder Maven-Konfiguration die folgende Abhängigkeit hinzu und ersetzen Sie den Platzhalter VERSION_NUMBER für die ausgewählte 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</groupId>
        <artifactId>transportation-driver</artifactId>
        <version>VERSION_NUMBER</version>
      </dependency>
    </dependencies>
    
  2. Driver SDK hängt vom Navigation SDK ab. Diese Abhängigkeit ist so konfiguriert, dass eine bestimmte Version des Navigation SDK in der Build-Konfigurationsdatei explizit definiert werden muss, wie im Folgenden dargestellt. Durch Weglassen des Codeblocks kann das Projekt immer die neueste Version des Navigation SDK in der Hauptversion herunterladen. Das Verhalten der neuesten Versionen des Driver SDK und des Navigation SDK wurde vor den Veröffentlichungen gründlicher Tests durchgeführt.

    Ordnen Sie die Abhängigkeitskonfiguration Ihrer Entwicklungs- und Release-Umgebungen entsprechend an.

    Gradle

    Fügen Sie zum build.gradle Folgendes hinzu:

    dependencies {
      ...
      implementation 'com.google.android.libraries.navigation:navigation:5.0.0'
    }
    

    Maven

    Fügen Sie zum pom.xml Folgendes hinzu:

    <dependencies>
      ...
      <dependency>
        <groupId>com.google.android.libraries.navigation</groupId>
        <artifactId>navigation</artifactId>
        <version>5.0.0</version>
      </dependency>
    </dependencies>
    

Manifest Ihrer App aktualisieren

Nachdem Sie Ihrer App das Driver SDK hinzugefügt haben, können Sie das Manifest Ihrer App aktualisieren, indem Sie die Datei AndroidManifest.xml bearbeiten.

Fügen Sie Ihren API-Schlüssel innerhalb des <application>-Elements hinzu. Sie müssen den Projekt-API-Schlüssel verwenden, den Sie bei der Einrichtung Ihres Entwicklungsprojekts erhalten haben.

Ersetzen Sie beispielsweise PASTE_YOUR_API_KEY_HERE durch Ihren API-Schlüssel in den folgenden Anwendungsmetadaten:

<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="PASTE_YOUR_API_KEY_HERE"/>

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

<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="PASTE_YOUR_API_KEY_HERE"/>

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

Nimm die erforderlichen Quellenangaben in deine App auf.

Wenn Sie das Driver SDK in Ihrer App verwenden, müssen Sie im Abschnitt mit den rechtlichen Hinweisen der App Quellenangaben und Open-Source-Lizenzen angeben. Die Quellenangaben sollten am besten als eigenständigen Menüpunkt oder als Teil des Menüpunkts About (Info) eingefügt werden.

Die Lizenzinformationen finden Sie in der Datei „third_party_licenses.txt“ in der nicht archivierten AAR-Datei.

Weitere Informationen zum Einfügen von Open-Source-Hinweisen finden Sie unter https://developers.google.com/android/guides/opensource.

Abhängigkeiten

Das Driver SDK nutzt gRPC, um mit dem Fleet Engine-Server zu kommunizieren. Wenn Sie gRPC noch nicht einbinden, 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 treten beim Driver SDK während der Laufzeit Fehler auf, während versucht wird, mit dem Fleet Engine-Server zu kommunizieren.

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

Das mindestens unterstützte API-Level ist 23.

SDK initialisieren

Zum Initialisieren des FleetEngine-Objekts ist eine Anbieter-ID (in der Regel die Google Cloud-Projekt-ID) erforderlich. 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. Ruft 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 die DeliveryVehicleReporter aus dem API-Objekt ab. (DeliveryVehicleReporter erweitert NavigationVehicleReporter.)

    DeliveryVehicleReporter vehicleReporter = driverApi.getDeliveryVehicleReporter();
    

Mit AuthTokenFactory authentifizieren

Wenn das Driver SDK Standortaktualisierungen generiert, müssen diese an den Google Fleet Engine-Server gesendet werden. Zum Authentifizieren dieser Anfragen ruft das Driver SDK eine vom Aufrufer bereitgestellte Instanz von AuthTokenFactory auf. Die Factory ist für das Generieren von Authentifizierungstokens zum Zeitpunkt der Standortaktualisierung verantwortlich.

Wie genau Tokens generiert werden, hängt von der Situation des jeweiligen Entwicklers ab. Für die Implementierung sind wahrscheinlich jedoch folgende Schritte erforderlich:

  • Ruft ein Authentifizierungstoken, möglicherweise im JSON-Format, von einem HTTPS-Server ab.
  • Parsen Sie das Token und speichern Sie es im Cache.
  • Aktualisieren Sie das Token, wenn es abläuft.

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

So sieht die grundlegende Implementierung einer AuthTokenFactory aus:

class JsonAuthTokenFactory implements AuthTokenFactory {
  String vehicleServiceToken;  // initially null
  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 URL(url).openStream()) {
      com.google.gson.JsonObject obj
          = new com.google.gson.JsonParser().parse(r);
      vehicleServiceToken = obj.get("VehicleServiceToken").getAsString();
      expiryTimeMs = obj.getAsLong("TokenExpiryMs");

      // 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 FleetEngine class will be notified and pass along the failed
      // update warning.
      throw new RuntimeException("Could not get auth token", e);
    }
  }
}

Bei dieser speziellen Implementierung wird der integrierte Java-HTTP-Client verwendet, um ein Token im JSON-Format vom Authentifizierungsserver des Entwicklers abzurufen. Das Token wird zur Wiederverwendung gespeichert. Das Token wird noch einmal abgerufen, wenn sich das alte Token innerhalb von 10 Minuten nach seiner Ablaufzeit befindet.

Ihre Implementierung kann anders vorgehen, z. B. die Verwendung eines Hintergrundthreads zum Aktualisieren von Tokens.

Ausnahmen in AuthTokenFactory werden als vorübergehend behandelt, sofern sie nicht wiederholt auftreten. Nach mehreren Versuchen geht das Driver SDK davon aus, dass der Fehler dauerhaft ist, und sendet keine Updates mehr.

Status- und Error Reporting mit StatusListener

Da das Driver SDK Aktionen im Hintergrund ausführt, verwenden Sie StatusListener, um bei bestimmten Ereignissen Benachrichtigungen auszulösen, z. B. Fehler, Warnungen oder Debug-Meldungen. Fehler können vorübergehend sein (z. B. BACKEND_CONNECTIVITY_ERROR) oder dazu führen, dass Standortaktualisierungen dauerhaft gestoppt werden (z. B. VEHICLE_NOT_FOUND, was einen Konfigurationsfehler anzeigt).

Du stellst eine optionale StatusListener-Implementierung wie die folgende bereit:

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

Intern verwendet die Driver SDK-Implementierung SSL/TLS, um sicher mit dem Fleet Engine-Server zu kommunizieren. Für ältere Android-Versionen (API-Versionen 23 oder älter) ist möglicherweise ein SecurityProvider-Patch für die Kommunikation mit dem Server erforderlich. Weitere Informationen zur Verwendung von SSL unter Android finden Sie unter Sicherheitsanbieter zum Schutz vor SSL-Exploits aktualisieren. Der Artikel enthält auch Codebeispiele zum Patchen des Sicherheitsanbieters.

Standortaktualisierungen aktivieren

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

DeliveryVehicleReporter reporter = ...;

reporter.enableLocationTracking();

Standortaktualisierungen werden nach Möglichkeit in regelmäßigen Abständen gesendet. Jede Standortaktualisierung gibt außerdem an, dass das Fahrzeug online ist.

Standardmäßig beträgt das Berichtsintervall 10 Sekunden. Sie können es jedoch mit FleetEngine.setLocationReportingInterval(long, TimeUnit) ändern. Das Mindestintervall für Updates beträgt 5 Sekunden. Häufigere Updates können zu langsameren Anfragen und Fehlern führen.

Standortaktualisierungen deaktivieren

Wenn die Schicht beendet ist, können Standortaktualisierungen durch Aufrufen von DeliveryVehicleReporter.disableLocationTracking gestoppt werden.

Anwendungsfälle für vertrauenswürdige Modelle

In diesem Abschnitt wird beschrieben, wie Sie das Driver SDK zur Implementierung häufiger Anwendungsfälle bei der Verwendung des vertrauenswürdigen Modells verwenden.

Fahrzeug erstellen

Sie können ein Fahrzeug über das Driver SDK erstellen.

Bevor du ein Fahrzeug erstellst, musst du die Delivery Driver API initialisieren. Die Fahrzeug-ID muss mit den Fahrzeug- und Anbieter-IDs erstellt werden, die während der Initialisierung des Driver SDK verwendet wurden. Erstellen Sie dann das Fahrzeug, wie im folgenden Beispiel gezeigt:

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 „Abholung einer Sendung“ erstellen

Sie können über das Driver SDK eine Aufgabe zum Abholen einer Sendung erstellen.

Bevor du eine Aufgabe erstellst, musst du die Delivery Driver API initialisieren. Die Aufgabe muss mit der Anbieter-ID erstellt werden, die bei der Initialisierung des Driver SDK angegeben wurde. Erstellen Sie dann die Aufgabe „Abholung der Sendung“, wie im folgenden Beispiel gezeigt. Weitere Informationen zu Aufgaben-IDs finden Sie in den Beispielen für Aufgaben-IDs.

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

Aufgabe für die Zustellung einer Sendung erstellen

Sie können über das Driver SDK eine Aufgabe für die Zustellung einer Sendung erstellen.

Bevor du eine Aufgabe erstellst, musst du die Delivery Driver API initialisieren. Erstellen Sie dann die Aufgabe „Lieferung“, wie im folgenden Beispiel gezeigt. Weitere Informationen zu Aufgaben-IDs finden Sie unter Beispiele für Aufgaben-IDs.

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 eine Aufgabe aus dem Driver SDK erstellen, die die Nichtverfügbarkeit angibt, z. B. für Fahrerpausen oder zum Tanken von Fahrzeugen. Eine geplante Aufgabe zur Nichtverfügbarkeit darf keine Tracking-ID enthalten. Optional können Sie einen Standort angeben.

Bevor du eine Aufgabe erstellst, musst du die Delivery Driver API initialisieren. Erstellen Sie dann die Nichtverfügbarkeitsaufgabe wie im folgenden Beispiel gezeigt. Weitere Informationen zu Aufgaben-IDs finden Sie unter Beispiele für Aufgaben-IDs.

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 einen geplanten Stopp-Task über das Driver SDK erstellen. Eine geplante Stoppaufgabe darf keine Tracking-ID enthalten.

Bevor du eine Aufgabe erstellst, musst du die Delivery Driver API initialisieren. Erstellen Sie dann die geplante Stoppaufgabe, wie im folgenden Beispiel gezeigt. Weitere Informationen zu Aufgaben-IDs finden Sie unter Beispiele für Aufgaben-IDs.

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.

Beim Aktualisieren der Aufgabenreihenfolge werden Aufgaben auch einem Fahrzeug zugewiesen, sofern sie vorher noch keinem Fahrzeug zugewiesen waren. Außerdem werden Aufgaben geschlossen, die zuvor einem Fahrzeug zugewiesen waren und nicht in der aktualisierten Bestellung enthalten waren. Wenn eine Aufgabe einem anderen Fahrzeug zugewiesen wird, wenn sie zuvor bereits einem anderen Fahrzeug zugewiesen war, wird ein Fehler ausgegeben. Bevor Sie dem neuen Fahrzeug eine Aufgabe zuweisen, schließen Sie die vorhandene Aufgabe und erstellen Sie eine neue.

Sie können die Aufgabenreihenfolge jederzeit aktualisieren.

Achten Sie vor der Aktualisierung der Aufgabenreihenfolge für ein Fahrzeug darauf, dass 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.
}

Es kann eine Ausnahme auftreten, die ein Update des internen Status des Driver SDK verhindern kann. Beheben Sie in diesem Fall das Problem und rufen Sie setVehicleStops noch einmal an, bis der Anruf erfolgreich ist.

Mögliche Probleme sind:

  • Die angegebenen VehicleStops entsprechen keinem gültigen Muster. Nur die erste VehicleStop kann sich in einem der VehicleStopStates befinden: NEW, ENROUTE oder ARRIVED. VehicleStops nach der aktuellen Haltestelle müssen sich im NEW VehicleStopState befinden.

  • Aufgaben sind entweder nicht vorhanden oder stammen aus einem anderen Fahrzeug.

  • Das Fahrzeug ist nicht vorhanden.

Fahrzeug ist auf dem Weg zur nächsten Haltestelle

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

Bevor Sie Fleet Engine darüber informieren, dass ein Fahrzeug von einer Haltestelle abgefahren ist, prüfen Sie, ob die Fahrzeughaltestellen erstellt und festgelegt wurden. Benachrichtigen Sie dann 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 auftreten, die ein Update des internen Status des Driver SDK verhindern kann. Beheben Sie in diesem Fall das Problem und rufen Sie enrouteToNextStop noch einmal auf, bis der Vorgang abgeschlossen ist.

Mögliche Probleme sind:

  • Im Driver SDK ist kein VehicleStops mehr festgelegt.

Fahrzeug kommt an einer Haltestelle an

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

Bevor Sie Fleet Engine darüber informieren, dass ein Fahrzeug an einer Haltestelle eingetroffen ist, prüfen Sie, ob die Haltestellenstopps festgelegt wurden. Informieren Sie dann 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.
}

Es kann eine Ausnahme auftreten, die ein Update des internen Status des Driver SDK verhindern kann. Beheben Sie in diesem Fall das Problem und rufen Sie arrivedAtStop noch einmal auf, bis der Vorgang erfolgreich ist.

Mögliche Probleme sind:

  • Im Driver SDK ist kein VehicleStops mehr festgelegt.

Fahrzeug hält an

Fleet Engine muss benachrichtigt werden, wenn ein Fahrzeug anhält. Dadurch werden alle mit der Haltestelle verbundenen Aufgaben auf den Status CLOSED gesetzt. Sie können Fleet Engine über das Driver SDK benachrichtigen.

Teilen Sie Fleet Engine mit, dass das Fahrzeug VehicleStop 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.
}

Es kann eine Ausnahme auftreten, die ein Update des internen Status des Driver SDK verhindern kann. Beheben Sie in diesem Fall das Problem und rufen Sie completedStop noch einmal auf, bis der Vorgang erfolgreich ist.

Mögliche Probleme sind:

  • Im Driver SDK ist kein VehicleStops mehr festgelegt.

Aufgaben schließen

Um eine Aufgabe zu schließen, die einem Fahrzeug zugewiesen wurde, informieren Sie entweder Fleet Engine, dass das Fahrzeug die Haltestelle abgeschlossen hat, an der die Aufgabe stattfindet, oder entfernen Sie das Fahrzeug 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 wurde und sie geschlossen werden muss, setzen Sie die Aufgabe auf den Status GESCHLOSSEN. Sie können eine GESCHLOSSENE Aufgabe jedoch nicht wieder öffnen.

Das Schließen einer Aufgabe ist kein Hinweis auf Erfolg oder Misserfolg. Es zeigt an, dass die Aufgabe nicht mehr als in Bearbeitung gilt. Für die Sendungsverfolgung ist es wichtig, das tatsächliche Ergebnis einer Aufgabe anzugeben, damit das Ergebnis der Lieferung angezeigt werden kann.

Eine Aufgabe muss einem Fahrzeug zugewiesen sein, damit das Driver SDK zum Schließen der Aufgabe verwendet werden kann. Wenn du eine Aufgabe schließen möchtest, die einem Fahrzeug zugewiesen wurde, informiere Fleet Engine darüber, dass das Fahrzeug die Haltestelle abgeschlossen hat, an der die Aufgabe stattfindet.

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

Aufgabenergebnis und Ergebnisort festlegen

Das Schließen einer Aufgabe bedeutet nicht, dass sie erfolgreich war oder nicht. Es zeigt an, dass die Aufgabe nicht mehr als in Bearbeitung gilt. Für die Sendungsverfolgung ist es wichtig, das tatsächliche Ergebnis einer Aufgabe anzugeben, damit das Lieferergebnis angezeigt werden kann und die Dienste ordnungsgemäß in Rechnung gestellt werden. Einmal festgelegt, können Sie das Ergebnis der Aufgabe nicht mehr ändern. Sie können die Zeit und den Ort der Aufgabenergebnisse jedoch ändern, nachdem Sie sie festgelegt haben.

Für Aufgaben, die sich im Status CLOSED (GESCHLOSSEN) befinden, kann das Ergebnis entweder auf SUCCEEDED (Erfolgreich) oder FAILED (FEHLGESCHLAGEN) gesetzt werden. Fleet Engine berechnet nur Lieferaufgaben mit dem Status ERFOLGREICH.

Beim Markieren des Ergebnisses einer Aufgabe trägt Fleet Engine automatisch den letzten bekannten Fahrzeugstandort als Ergebnisort der Aufgabe ein. Sie können dieses Verhalten überschreiben, indem Sie Fleet Engine aufrufen. Sie können den Speicherort für Aufgabenergebnisse nicht mit dem Driver SDK festlegen.

Das folgende Codebeispiel zeigt, wie Sie mit dem Driver SDK ein Aufgabenergebnis und einen Zeitstempel 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 im Driver SDK nach einem Fahrzeug suchen. Bevor du nach einem Fahrzeug suchst, musst du die Delivery Driver API initialisieren. Sie können dann nach dem Fahrzeug suchen, wie im folgenden Beispiel gezeigt.

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

Das DeliveryVehicleManager kann die DeliveryVehicle nur für die Fahrzeug-ID abrufen, die bei der Initialisierung der Delivery Driver API angegeben wurde.