Erste Schritte mit dem Driver SDK für Android

Mindestsystemanforderungen

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

Build- und Abhängigkeiten-Konfiguration

Die Treiber-SDK-Versionen 4.99 und höher sind im Google Maven-Repository verfügbar.

Gradle

Fügen Sie der Datei build.gradle Folgendes hinzu:

repositories {
    ...
    google()
}

Maven

Fügen Sie der Datei pom.xml Folgendes hinzu:

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

Projektkonfiguration

Damit du das Driver SDK verwenden kannst, muss deine App auf minSdkVersion ausgerichtet sein 23 oder höher. Weitere Informationen finden Sie unter Versionshinweise

Zum Ausführen einer App, die mit dem Driver SDK erstellt wurde, muss das Android-Gerät Google Play-Dienste installiert haben.

Entwicklungsprojekt einrichten

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

  1. Erstellen Sie eine neue Google Cloud Console. Projekt erstellen oder ein vorhandenes Projekt auswählen mit dem Treiber-SDK. Warten Sie ein paar Minuten, bis Das neue Projekt ist in der Google Cloud Console sichtbar.

  2. Zum Ausführen der Demo-App muss Ihr Projekt Zugriff auf das Maps SDK haben für Android. Wählen Sie in der Google Cloud Console APIs und Dienste > Bibliothek. Suchen Sie dann nach dem Maps SDK und aktivieren Sie es für Android

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

Treiber-SDK zur App hinzufügen

Das Treiber-SDK ist im Google Maven-Repository verfügbar. Die enthält das Project Object Model (.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: Ersetzen des Platzhalters VERSION_NUMBER durch die ausgewählte Version von das Treiber-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>
    
  2. Das Treiber-SDK hängt vom Navigation SDK ab. Diese Abhängigkeit wird so konfiguriert, eine spezielle Version des Navigation SDK explizit in der Build-Konfigurationsdatei definiert werden: Wenn der erwähnte Codeblock ausgelassen wird, kann das Projekt immer die neueste Version des Navigation SDK innerhalb der Hauptversion. Beachten Sie, dass die aktuellen Versionen des Driver SDK und Das Navigation SDK wurde vor der Veröffentlichung strengen Tests unterzogen.

    Abhängigkeitskonfiguration der Entwicklung und des Release anordnen Umgebungen entsprechend angepasst werden.

    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>
    

API-Schlüssel in die App einfügen

Fügen Sie Ihrer App den API-Schlüssel hinzu, nachdem Sie das Driver SDK hinzugefügt haben. Ich müssen Sie den API-Schlüssel des Projekts verwenden, den Sie bei der ein Entwicklungsprojekt eingerichtet.

In diesem Abschnitt wird beschrieben, wie Sie Ihren API-Schlüssel speichern, um sicherer zu werden. auf den in Ihrer App verwiesen wird. Sie sollten Ihren API-Schlüssel nicht in Ihre Version einchecken zu steuern. Sie sollte in der Datei local.properties gespeichert werden, im Stammverzeichnis Ihres Projekts. Weitere Informationen zur local.properties-Datei, siehe Gradle-Attributdateien.

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

  1. Öffnen Sie die Datei build.gradle auf Stammebene und fügen Sie folgenden Code in das dependencies-Element unter buildscript.

    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 folgenden Code in den plugins-Element.

    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 die Datei local.properties in Ihrem Verzeichnis auf Projektebene und fügen Sie den folgenden Code. Achten Sie darauf, YOUR_API_KEY durch Ihren API-Schlüssel zu ersetzen.

    MAPS_API_KEY=YOUR_API_KEY
    
  5. Gehen Sie in der Datei AndroidManifest.xml zu com.google.android.geo.API_KEY 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 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="${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>

Fügen Sie Ihrer App die erforderlichen Quellenangaben hinzu.

Wenn Sie das Driver SDK in Ihrer App verwenden, müssen Sie Attributionstext und Open-Source-Lizenzen als Teil der rechtlichen Hinweise Ihrer App . Die Quellenangaben sollten am besten als eigenständiges Menüelement im Menüpunkt Info.

Die Lizenzinformationen finden Sie in der Datei "third_party_Licenses.txt". Datei in nicht mehr archivierte AAR-Dateien.

Weitere Informationen finden Sie unter https://developers.google.com/android/guides/opensource. zur Einbindung von Open-Source-Hinweisen.

Abhängigkeiten

Das Driver SDK verwendet gRPC zu mit dem Fleet Engine-Server kommunizieren. Wenn Sie gRPC noch nicht einbinden, müssen 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 Fehler während der Laufzeit wenn versucht wird, mit dem Fleet Engine-Server zu kommunizieren.

Wenn Sie ProGuard für Folgendes verwenden: um Ihre Builds zu optimieren, müssen Sie Ihrem ProGuard Konfigurationsdatei:

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

Das Mindest-API-Level, das unterstützt wird, ist 23.

SDK initialisieren

Eine Anbieter-ID (in der Regel die Google Cloud-Projekt-ID) ist erforderlich, Initialisieren Sie das DriverContext-Objekt. Weitere Informationen zum Einrichten der Google Cloud-Projekt, siehe Authentifizierung und Autorisierung.

Bevor Sie das Treiber-SDK verwenden können, müssen Sie es initialisieren das Navigation SDK. So initialisieren Sie das SDK:

  1. Rufen Sie ein Navigator-Objekt aus 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 DriverContext-Objekt, 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, muss er diese Aktualisierungen an Fleet Engine-Server. Zur Authentifizierung dieser Anfragen Das Treiber-SDK sendet eine Anfrage an einen vom Anrufer bereitgestellten Instanz von AuthTokenFactory. Die Factory ist für das Generieren von Authentifizierungstokens am Standort verantwortlich Aktualisierungszeit.

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

  • Authentifizierungstoken, möglicherweise im JSON-Format, von einem HTTPS-Server abrufen
  • Token analysieren und im Cache speichern
  • 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) zur Autorisierung erstellen:

Hier ist die grundlegende Implementierung einer 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);
    }
  }
}

Diese spezielle Implementierung verwendet den integrierten Java-HTTP-Client, um eine Token im JSON-Format vom Authentifizierungsserver des Entwicklers. Das Token ist werden zur Wiederverwendung gespeichert. Das Token wird noch einmal abgerufen, wenn das alte Token innerhalb von 10 Minuten verfügbar ist. ihrer Ablaufzeit zu ändern.

Ihre Implementierung kann andere Dinge bewirken, z. B. durch die Verwendung eines Hintergrundthreads. um Tokens zu aktualisieren.

Ausnahmen in der Liste „AuthTokenFactory“ werden als vorübergehend eingestuft, sofern sie nicht auftreten wiederholt. Nach mehreren Versuchen zeigt das Driver SDK geht davon aus, dass der Fehler dauerhaft ist und nicht mehr versucht wird, Aktualisierungen zu senden.

Status- und Error Reporting mit StatusListener

Da das Treiber-SDK Aktionen im Hintergrund verwenden, verwenden Sie StatusListener, um Benachrichtigungen auszulösen, wie Fehler, Warnungen oder Debug-Meldungen auftreten. Fehler können sein vorübergehender Natur sein (z. B. BACKEND_CONNECTIVITY_ERROR) oder sie können werden Standortupdates dauerhaft beendet (z. B. VEHICLE_NOT_FOUND, deutet auf einen Konfigurationsfehler hin.

Sie stellen 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 nutzt die Driver SDK-Implementierung SSL/TLS für die sichere Kommunikation mit dem Fleet Engine-Server Frühere Versionen von Android (API-Version 23 oder früher) möglicherweise einen SecurityProvider-Patch für die Kommunikation mit dem Server. Weitere Informationen zur Verwendung von SSL unter Android finden Sie unter Sicherheits-GMD-Anbieter. Der Artikel enthält außerdem Codebeispiele zum Patchen des Sicherheitsanbieters.

Standortaktualisierungen aktivieren

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

DeliveryVehicleReporter reporter = ...;

reporter.enableLocationTracking();

Standortaktualisierungen werden nach Möglichkeit in regelmäßigen Abständen gesendet. Jeder Standort wird auch angezeigt, dass das Fahrzeug online ist.

Standardmäßig beträgt das Berichtsintervall 10 Sekunden. Sie können die Berichtsarten Intervall mit reporter.setLocationReportingInterval(long, TimeUnit). Die Das unterstützte Mindestaktualisierungsintervall beträgt mindestens 5 Sekunden. Häufigere Updates können zu langsameren Anfragen und Fehlern führen.

Standortaktualisierungen deaktivieren

Wenn der Fahrer die Schicht beendet hat, kannst du Standortupdates stoppen, indem du folgenden Befehl rufst: DeliveryVehicleReporter.disableLocationTracking

Anwendungsfälle für vertrauenswürdige Modelle

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

Fahrzeug erstellen

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

Bevor Sie ein Fahrzeug erstellen, Initialisieren Sie die Delivery Driver API. Die Fahrzeug-ID muss mit der verwendeten Fahrzeug- und Anbieter-ID erstellt werden während der Initialisierung des Treiber-SDKs. Erstellen Sie dann das Fahrzeug 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 Sendung erstellen

Sie können eine Aufgabe zur Abholung der Sendung über das Driver SDK erstellen.

Bevor Sie eine Aufgabe erstellen, Initialisieren Sie die Delivery Driver API. Die Aufgabe muss mit der Anbieter-ID erstellt werden, die während des Driver SDK angegeben wurde die Initialisierung bei. Erstellen Sie dann die Aufgabe für die Abholung der Sendung, wie im Folgenden gezeigt: Beispiel. 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 Sendungszustellung erstellen

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

Bevor Sie eine Aufgabe erstellen, Initialisieren Sie die Delivery Driver API. Erstellen Sie dann die Aufgabe für die Sendungszustellung, wie im folgenden Beispiel gezeigt. 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 erstellen, die auf Nichtverfügbarkeit hinweist (z. B. für Fahrerinnen und Fahrer) oder beim Tanken von Fahrzeugen) aus dem Driver SDK heraus. Eine geplante Nichtverfügbarkeit Aufgabe darf keine Tracking-ID enthalten. Optional können Sie einen Standort angeben.

Bevor Sie eine Aufgabe erstellen, Initialisieren Sie die Delivery Driver API. Erstellen Sie dann die Nichtverfügbarkeitsaufgabe, wie im folgenden Beispiel gezeigt. 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 eine geplante Stoppaufgabe entweder über das Driver SDK erstellen. Eine geplante der Stop-Task keine Tracking-ID enthält.

Bevor Sie eine Aufgabe erstellen, Initialisieren Sie die Delivery Driver API. Erstellen Sie dann die geplante Stoppaufgabe, wie im folgenden Beispiel gezeigt. 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

Die Reihenfolge der Aufgaben, die einem Fahrzeug zugewiesen sind, lässt sich über die Treiber-SDK.

Beim Aktualisieren der Aufgabenreihenfolge werden einem Fahrzeug auch Aufgaben zugewiesen, sofern diese nicht die zuvor einem Fahrzeug zugewiesen waren. Außerdem werden Aufgaben, die zuvor einem Fahrzeug zugewiesen und wurden bei der aktualisierten Bestellung nicht berücksichtigt. Zuweisen eines wenn sie zuvor einem anderen Fahrzeug zugewiesen worden wäre. einen Fehler erzeugt. Bevor Sie dem neuen Fahrzeug eine Aufgabe zuweisen, schließen Sie und erstellen dann eine neue.

Sie können die Aufgabenreihenfolge jederzeit aktualisieren.

Bevor Sie die Aufgabenreihenfolge für ein Fahrzeug aktualisieren, sollten Sie sich vergewissern, dass das Fahrzeug und Aufgaben wurden bereits in Fleet Engine erstellt. 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 verhindern könnte in den internen Status des Treiber-SDK. Beheben Sie in diesem Fall das Problem und Rufen Sie setVehicleStops noch einmal auf, bis der Anruf erfolgreich ist.

Mögliche Probleme sind:

  • Die angegebenen VehicleStops folgen keinem gültigen Muster. Nur die ersten VehicleStop kann einen der folgenden VehicleStopStates haben: NEW, ENROUTE oder ARRIVED. VehicleStops nach der aktuellen Haltestelle müssen den Wert NEW VehicleStopState haben.

  • Aufgaben sind entweder nicht vorhanden oder gehören zu 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 um die Navigation zu starten. Sie können Fleet Engine über das Driver SDK benachrichtigen.

Bevor Sie Fleet Engine benachrichtigen, dass ein Fahrzeug von einer Haltestelle abgefahren wurde, prüfen Sie, ob die Haltestellen erstellt und festgelegt wurden. Informieren Sie dann Fleet Engine über die wie im folgenden Beispiel dargestellt.

    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 eine Aktualisierung der Treiber-SDKs internen Zustand. Beheben Sie in diesem Fall das Problem und rufen Sie enrouteToNextStop, bis er erfolgreich ist.

Mögliche Probleme sind:

  • Keine verbleibenden VehicleStops im Driver SDK festgelegt.

Fahrzeug landet an einer Haltestelle

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 über die Ankunft eines Fahrzeugs an einer Haltestelle benachrichtigen, prüfen Sie, ob die Haltestellen wurden festgelegt. Benachrichtigen Sie dann Fleet Engine über die Ankunft des Fahrzeugs. an der Haltestelle an, 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 eine Aktualisierung des internen Treiber-SDKs Bundesstaat. Beheben Sie in diesem Fall das Problem und rufen Sie arrivedAtStop dann noch einmal an. bis sie erfolgreich ist.

Mögliche Probleme sind:

  • Keine verbleibenden VehicleStops im Driver SDK festgelegt.

Fahrzeug hält an

Sie müssen Fleet Engine benachrichtigen, wenn ein Fahrzeug anhält. Diese Benachrichtigung führt dazu, dass alle mit der Haltestelle verknüpften Aufgaben in den Status CLOSED (GESCHLOSSEN) gesetzt werden. Sie können Fleet Engine über das Driver SDK benachrichtigen.

Benachrichtigen Sie Fleet Engine, dass das Fahrzeug seine VehicleStop abgeschlossen hat (siehe Abbildung im folgenden Beispiel.

    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 eine Aktualisierung des internen Treiber-SDKs Bundesstaat. Beheben Sie in diesem Fall das Problem und rufen Sie completedStop dann noch einmal an. bis sie erfolgreich ist.

Mögliche Probleme sind:

  • Keine verbleibenden VehicleStops im Driver SDK festgelegt.

Aufgabe schließen

Zum Schließen einer Aufgabe, die einem Fahrzeug zugewiesen wurde, müssen Sie entweder Fleet Engine benachrichtigen ob das Fahrzeug an der Haltestelle abgeschlossen wurde, an der die Aufgabe stattfindet, oder aus der Liste der Haltestellen entfernen. Dazu können Sie die Liste der das verbleibende Fahrzeug anhält, Aktualisieren der Aufgabenreihenfolge für ein Fahrzeug.

Wenn eine Aufgabe noch keinem Fahrzeug zugewiesen wurde und geschlossen werden muss, aktualisieren Sie die in den Status CLOSED gesetzt. GESCHLOSSENE Aufgaben können jedoch nicht wieder geöffnet werden.

Das Schließen einer Aufgabe weist nicht auf Erfolg oder Misserfolg hin. Es zeigt an, dass die Aufgabe gilt nicht mehr als in Bearbeitung. Für die Sendungsverfolgung ist es wichtig, das tatsächliche Ergebnis einer Aufgabe anzeigen, damit ein Lieferergebnis angezeigt werden kann.

Damit das Driver SDK verwendet werden kann, muss einem Fahrzeug eine Aufgabe zugewiesen werden um die Aufgabe abzuschließen. Zum Schließen einer Aufgabe, die einem Fahrzeug zugewiesen wurde, Fleet Engine, ob das Fahrzeug die Haltestelle abgeschlossen hat, an der die Aufgabe stattfindet.

Alternativ aktualisieren Sie die Aufgabenreihenfolge des Fahrzeugs der Aufgabe zugewiesen ist, und entfernen Sie sie dann aus der Liste der Zwischenstopps.

Aufgabenergebnis und Ergebnisort festlegen

Das Schließen einer Aufgabe weist nicht auf Erfolg oder Misserfolg hin. Es zeigt an, dass die Aufgabe gilt nicht mehr als in Bearbeitung. Für die Sendungsverfolgung ist es wichtig, das tatsächliche Ergebnis einer Aufgabe anzeigen, damit ein Lieferergebnis angezeigt werden kann, dass die Dienste ordnungsgemäß abgerechnet werden. Sie können die Einstellung das Ergebnis der Aufgabe. Sie können jedoch die Zeit und den Ort des Aufgabenergebnisses ändern. nachdem Sie sie festgelegt haben.

Für Aufgaben, die sich im Status CLOSED befinden, kann das Ergebnis entweder auf ERFOLGREICH oder FEHLGESCHLAGEN. Fleet Engine berechnet nur Lieferaufgaben mit dem Status ERFOLGREICH.

Beim Markieren des Ergebnisses einer Aufgabe gibt Fleet Engine automatisch Standort des Aufgabenergebnisses mit dem letzten bekannten Fahrzeugstandort. Sie können dieses Verhaltens.

Das folgende Beispiel zeigt, wie Sie mit dem Driver SDK ein Aufgabenergebnis festlegen. und Zeitstempel. Sie können den Speicherort des Aufgabenergebnisses nicht mit dem Driver SDK 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.
    }

Fahrzeug suchen

Sie können ein Fahrzeug im Driver SDK suchen. Bevor Sie nach einem Fahrzeug suchen, sicherstellen, dass Sie Initialisieren Sie die Delivery Driver API. Sie können dann das Fahrzeug wie im folgenden Beispiel suchen.

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