Pierwsze kroki z pakietem SDK Driver na Androida

Minimalne wymagania systemowe

Na urządzeniu mobilnym musi być zainstalowany Android 6.0 (poziom interfejsu API 23) lub nowszy.

Konfiguracja Maven

Pakiet SDK sterowników w wersji 4.99 i nowszych jest dostępny w repozytorium Google Maven.

Gradle

Dodaj do pliku build.gradle te informacje:

repositories {
    ...
    google()
}

Maven

Dodaj do pliku pom.xml te informacje:

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

Konfiguracja projektu

Aby korzystać z pakietu Driver SDK, Twoja aplikacja musi być kierowana na system minSdkVersion w wersji 23 lub nowszej. Więcej dowiesz się z informacji o wersji.

Aby uruchomić aplikację utworzoną za pomocą pakietu Driver SDK, na urządzeniu z Androidem muszą być zainstalowane Usługi Google Play.

Konfigurowanie projektu programistycznego

Aby skonfigurować projekt i uzyskać dla niego klucz interfejsu API w konsoli Google Cloud:

  1. Utwórz nowy projekt w Google Cloud Console lub wybierz już istniejący do użycia z pakietem Driver SDK. Zaczekaj kilka minut, aż nowy projekt pojawi się w konsoli Google Cloud.

  2. Aby uruchomić aplikację demonstracyjną, Twój projekt musi mieć dostęp do pakietu SDK Map Google na Androida. W konsoli Google Cloud wybierz Interfejsy API i usługi > Biblioteka, a następnie wyszukaj i włącz pakiet SDK Map Google na Androida.

  3. Aby uzyskać klucz interfejsu API dla projektu, wybierz Interfejsy API i usługi > Dane logowania > Utwórz dane logowania > Klucz interfejsu API. Więcej informacji na temat uzyskiwania klucza interfejsu API znajdziesz w artykule na temat uzyskiwania klucza interfejsu API.

Dodaj do aplikacji pakiet SDK sterownika

Pakiet Driver SDK jest dostępny w repozytorium Google Maven. Repozytorium zawiera pliki projektu Object Model (.pom) pakietu SDK i dokumenty Javadocs. Aby dodać pakiet SDK sterownika do aplikacji:

  1. Dodaj tę zależność do konfiguracji Gradle lub Maven, zastępując zmienną VERSION_NUMBER odpowiednią dla wybranej wersji pakietu Driver SDK.

    Gradle

    Dodaj do tablicy build.gradle:

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

    Maven

    Dodaj do tablicy pom.xml:

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

Zaktualizuj plik manifestu aplikacji

Po dodaniu pakietu SDK sterownika do aplikacji możesz zaktualizować jej plik manifestu, edytując plik AndroidManifest.xml.

Dodaj klucz interfejsu API w elemencie <application>. Musisz użyć klucza interfejsu API projektu uzyskanego podczas konfigurowania projektu.

Na przykład zastąp PASTE_YOUR_API_KEY_HERE kluczem interfejsu API w tych metadanych aplikacji:

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

Ten przykład zawiera pełny plik manifestu przykładowej aplikacji:

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

Umieść w aplikacji wymagane informacje o atrybucji

Jeśli w swojej aplikacji używasz pakietu SDK sterownika, w sekcji z informacjami prawnymi musisz umieścić tekst opisu i licencje open source. Informacje o źródłach powinny być dodawane jako niezależne pozycje w menu lub jako część pozycji Informacje.

Wymagany tekst atrybucji i licencje open source znajdziesz w pliku ZIP z pakietem Driver SDK:

  • NOTICE.txt
  • LICENSES.txt

Zależności

Pakiet SDK sterownika używa gRPC do komunikacji z serwerem Fleet Engine. Jeśli nie importujesz jeszcze gRPC, konieczne może być zadeklarowanie tych zależności:

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

Bez tych zależności pakiet SDK sterownika zgłasza błędy w czasie działania podczas próby komunikacji z serwerem Fleet Engine.

Jeśli do optymalizowania kompilacji używasz ProGuard, może być konieczne dodanie do pliku konfiguracji ProGuard tych wierszy:

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

Minimalny obsługiwany poziom interfejsu API to 23.

Zainicjuj pakiet SDK

Do zainicjowania obiektu FleetEngine wymagany jest identyfikator dostawcy (zwykle identyfikator projektu Google Cloud). Więcej informacji o konfigurowaniu projektu Google Cloud znajdziesz w artykule na temat uwierzytelniania i autoryzacji.

Przed użyciem pakietu Driver SDK musisz zainicjować pakiet Navigation SDK. Aby zainicjować pakiet SDK:

  1. Uzyskaj obiekt Navigator z klasy NavigationApi.

    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. Utwórz obiekt DriverContext, wypełniając wymagane pola.

    DriverContext driverContext = DriverContext.builder(application)
                 .setProviderId(providerId)
                 .setVehicleId(vehicleId)
                 .setAuthTokenFactory(authTokenFactory)
                 .setNavigator(navigator)
                 .setRoadSnappedLocationProvider(
                     NavigationApi.getRoadSnappedLocationProvider(application))
                 .build()
    
  3. Użyj obiektu DriverContext do zainicjowania *DriverApi.

    DeliveryDriverApi driverApi = DeliveryDriverApi.createInstance(driverContext);
    
  4. Uzyskaj DeliveryVehicleReporter z obiektu interfejsu API. (DeliveryVehicleReporter rozszerza: NavigationVehicleReporter).

    DeliveryVehicleReporter vehicleReporter = driverApi.getDeliveryVehicleReporter();
    

Uwierzytelnij za pomocą AuthTokenFactory

Gdy pakiet SDK sterownika generuje aktualizacje lokalizacji, musi je wysyłać do serwera Google Fleet Engine. Aby uwierzytelnić te żądania, pakiet SDK sterownika wywołuje metodę AuthTokenFactory dostarczaną przez element wywołującego. Fabryka jest odpowiedzialna za generowanie tokenów uwierzytelniania podczas aktualizacji lokalizacji.

Sposób generowania tokenów zależy od sytuacji danego dewelopera. Implementacja musi jednak:

  • Pobieraj token uwierzytelniania, na przykład w formacie JSON, z serwera HTTPS.
  • Przeanalizuj token i zapisz go w pamięci podręcznej.
  • Odśwież token, gdy straci ważność.

Informacje o tokenach oczekiwanych przez serwer Fleet Engine znajdziesz w artykule o tworzeniu tokena internetowego JSON (JWT) do autoryzacji.

Oto szkieletowa implementacja AuthTokenFactory:

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);
    }
  }
}

W tej implementacji korzysta się z wbudowanego klienta HTTP w języku Java do pobierania tokena w formacie JSON z serwera uwierzytelniania dewelopera. Token jest zapisywany do ponownego użycia. Token jest pobierany ponownie, jeśli minie 10 minut od wygaśnięcia starego tokena.

Twoja implementacja może działać w inny sposób, na przykład odświeżać tokeny przez wątek w tle.

Wyjątki w polu AuthTokenFactory są traktowane jako przejściowe, chyba że będą się powtarzać. Po określonej liczbie prób pakiet SDK sterownika zakłada, że błąd jest trwały i przestaje próbować wysyłać aktualizacje.

Raportowanie stanu i błędów w usłudze StatusListener

Ponieważ pakiet SDK sterownika wykonuje działania w tle, należy używać pakietu StatusListener do aktywowania powiadomień po wystąpieniu określonych zdarzeń, takich jak błędy, ostrzeżenia czy komunikaty debugowania. Błędy mogą być przejściowe (np. BACKEND_CONNECTIVITY_ERROR) lub powodować trwałe zatrzymanie aktualizacji lokalizacji (np. VEHICLE_NOT_FOUND oznacza błąd konfiguracji).

Podajesz opcjonalną implementację StatusListener, taką jak:

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

Uwagi na temat SSL/TLS

Wewnętrznie implementacja pakietu SDK sterownika używa SSL/TLS do bezpiecznej komunikacji z serwerem Fleet Engine. Wcześniejsze wersje Androida (interfejsy API w wersji 23 lub starszej) mogą wymagać poprawki SecurityProvider do komunikacji z serwerem. Więcej informacji o pracy z protokołem SSL w Androidzie znajdziesz w artykule Aktualizowanie dostawcy zabezpieczeń w celu ochrony przed wykorzystaniem luk w zabezpieczeniach SSL. Artykuł zawiera też przykłady kodu do zainstalowania poprawek u dostawcy zabezpieczeń.

Włącz aktualizacje lokalizacji

Po wygenerowaniu instancji *VehicleReporter włączenie aktualizacji lokalizacji jest proste:

DeliveryVehicleReporter reporter = ...;

reporter.enableLocationTracking();

Aktualizacje lokalizacji są wysyłane w regularnych odstępach czasu, o ile to możliwe. Każda aktualizacja lokalizacji wskazuje też, że pojazd jest online.

Domyślna długość okresu raportowania wynosi 10 sekund, ale możesz go zmienić za pomocą funkcji FleetEngine.setLocationReportingInterval(long, TimeUnit). Minimalny obsługiwany interwał aktualizacji to 5 sekund. Częstsze aktualizacje mogą skutkować wolniejszym przesyłaniem żądań i błędami.

Wyłącz aktualizacje lokalizacji

Po zakończeniu pracy kierowcy aktualizacje lokalizacji możesz zatrzymać, dzwoniąc do firmy DeliveryVehicleReporter.disableLocationTracking.

Przypadki użycia zaufanego modelu

W tej sekcji opisujemy, jak za pomocą pakietu SDK sterownika wykonywać typowe przypadki użycia z wykorzystaniem modelu zaufanego.

Utwórz pojazd

Możesz utworzyć pojazd za pomocą pakietu Driver SDK.

Zanim utworzysz pojazd, zainicjuj interfejs Delivery Driver API. Identyfikator pojazdu należy utworzyć z identyfikatorami pojazdu i dostawcy używanymi podczas inicjowania pakietu SDK kierowcy. Następnie utwórz pojazd, jak pokazano w tym przykładzie:

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

Tworzenie zadania odbioru przesyłki

Zadanie odbioru przesyłki możesz utworzyć w pakiecie SDK Driver SDK.

Zanim utworzysz zadanie, zainicjuj interfejs Delivery Driver API. Zadanie należy utworzyć przy użyciu identyfikatora dostawcy określonego podczas inicjowania pakietu Driver SDK. Następnie utwórz zadanie odbioru przesyłki w sposób podany poniżej. Więcej informacji o identyfikatorach zadań znajdziesz w sekcji Przykłady identyfikatorów zadań.

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

Tworzenie zadania dostawy

Zadanie dostawy przesyłki możesz utworzyć w pakiecie Driver SDK.

Zanim utworzysz zadanie, zainicjuj interfejs Delivery Driver API. Następnie utwórz zadanie dostawy zgodnie z poniższym przykładem. Więcej informacji o identyfikatorach zadań znajdziesz w artykule Przykłady identyfikatorów zadań.

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

Planowana niedostępność

Za pomocą pakietu SDK Driver możesz utworzyć zadanie wskazujące niedostępność (np. dotyczące przerw kierowcy lub tankowania pojazdów). Zaplanowane zadanie niedostępności nie może zawierać identyfikatora śledzenia. Możesz też podać lokalizację.

Zanim utworzysz zadanie, zainicjuj interfejs Delivery Driver API. Następnie utwórz zadanie związane z niedostępnością w sposób podany w poniższym przykładzie. Więcej informacji o identyfikatorach zadań znajdziesz w artykule Przykłady identyfikatorów zadań.

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

Zaplanowane przystanki

Zaplanowane zadanie zatrzymania możesz utworzyć w pakiecie SDK sterownika. Zaplanowane zadanie zatrzymania nie może zawierać identyfikatora śledzenia.

Zanim utworzysz zadanie, zainicjuj interfejs Delivery Driver API. Następnie utwórz zadanie zaplanowanego zatrzymania, jak pokazano w poniższym przykładzie. Więcej informacji o identyfikatorach zadań znajdziesz w artykule Przykłady identyfikatorów zadań.

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

Zaktualizuj kolejność zadań

Możesz zaktualizować kolejność wykonywania zadań przypisanych do pojazdu z pakietu SDK sterownika.

Aktualizacja kolejności zadań powoduje też przypisanie do pojazdu zadań, które nie były wcześniej przypisane do tego pojazdu. Zamyka również zadania, które zostały wcześniej przypisane do pojazdu i które nie zostały uwzględnione w zaktualizowanej kolejności. Przypisanie zadania do innego pojazdu, jeśli było ono wcześniej przypisane do innego pojazdu, spowoduje wystąpienie błędu. Przed przypisaniem zadania do nowego pojazdu zamknij bieżące zadanie, a następnie utwórz nowe.

Kolejność zadań możesz zmienić w każdej chwili.

Zanim zaktualizujesz kolejność zadań w pojeździe, sprawdź, czy ten pojazd i zadania zostały już utworzone we Fleet Engine. Następnie zaktualizuj kolejność zadań w pojeździe, postępując zgodnie z przykładem poniżej.

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

Wyjątkiem może być aktualizacja stanu wewnętrznego pakietu SDK sterownika. Jeśli tak się stanie, rozwiąż problem, a następnie wywołaj ponownie numer setVehicleStops, aż połączenie się powiedzie.

Możliwe problemy:

  • Podane wartości VehicleStops są niepoprawne. Tylko pierwszy pojazd może mieć wartość VehicleStopState: NEW, ENROUTE lub ARRIVED. Wartość VehicleStops po obecnym przystanku musi mieć wartość NEW VehicleStopState.

  • Zadania nie istnieją lub należą do innego pojazdu.

  • Pojazd nie istnieje.

Pojazd jest w drodze do następnego przystanku

Usługa Fleet Engine musi być powiadamiana o tym, gdy pojazd wyjeżdża ze przystanku i rozpoczyna nawigację. Możesz powiadomić Fleet Engine za pomocą pakietu SDK sterownika.

Zanim powiadomisz Fleet Engine o tym, że pojazd wyjechał ze postoju, upewnij się, że został on utworzony i ustawiony. Następnie powiadom Fleet Engine o odjazdu pojazdu, jak pokazano w poniższym przykładzie.

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

Może wystąpić wyjątek, który uniemożliwia aktualizację stanu wewnętrznego pakietu SDK sterownika. Jeśli tak się stanie, rozwiąż problem, a następnie wywołaj ponownie metodę enrouteToNextStop, aż zadziała.

Możliwe problemy:

  • W pakiecie SDK sterownika nie ustawiono żadnych plików VehicleStops.

Pojazd dojeżdżający do przystanku

Usługa Fleet Engine musi być powiadamiana, gdy pojazd znajdzie się na zatrzymaniu. Fleet Engine możesz wysyłać za pomocą pakietu Driver SDK.

Zanim powiadomisz Fleet Engine o zatrzymaniu pojazdu, upewnij się, że ustawiono postoje. Następnie powiadom Fleet Engine o przybyciu pojazdu na postój, jak pokazano w poniższym przykładzie.

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

Wyjątek, który może uniemożliwić aktualizację stanu wewnętrznego pakietu SDK sterownika. W takim przypadku rozwiąż problem, a następnie wywołuj funkcję arrivedAtStop ponownie, aż operacja się powiedzie.

Możliwe problemy:

  • W pakiecie SDK sterownika nie ustawiono żadnych plików VehicleStops.

Pojazd zatrzymuje się

Usługa Fleet Engine musi być powiadamiana, gdy pojazd się zatrzyma. W ten sposób wszystkie zadania powiązane z przystankiem zostaną ustawione w stan ZAMKNIĘTE. Możesz powiadomić Fleet Engine z poziomu pakietu SDK sterownika.

Powiadom Fleet Engine o zakończeniu operacji VehicleStop, jak pokazano w poniższym przykładzie.

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

Wyjątek, który może uniemożliwić aktualizację stanu wewnętrznego pakietu SDK sterownika. W takim przypadku rozwiąż problem, a następnie wywołuj funkcję completedStop ponownie, aż operacja się powiedzie.

Możliwe problemy:

  • W pakiecie SDK sterownika nie ustawiono żadnych plików VehicleStops.

Zamykanie zadania

Aby zamknąć zadanie przypisane do pojazdu, możesz powiadomić Fleet Engine, że pojazd zakończył postój, na którym to zadanie jest wykonywane, lub usunąć go z listy postojów. Aby to zrobić, możesz ustawić listę pozostałych przystanków pojazdu, tak jak podczas aktualizowania kolejności zadań w przypadku pojazdu.

Jeśli do zadania nie przypisano jeszcze pojazdu i trzeba je zamknąć, zmień stan zadania na ZAMKNIĘTE. Nie możesz jednak ponownie otworzyć zadania ZAMKNIĘTE.

Zakończenie zadania nie oznacza powodzenia lub niepowodzenia. Oznacza to, że zadanie nie jest już uważane za ukończone. W przypadku śledzenia przesyłki ważne jest wskazanie rzeczywistego wyniku zadania, aby można było zobaczyć wynik dostawy.

Aby można było je zamknąć za pomocą pakietu SDK kierowcy, należy przypisać je do pojazdu. Aby zamknąć zadanie przypisane do pojazdu, powiadom Fleet Engine o tym, że pojazd zakończył postój w miejscu, w którym jest wykonywane zadanie.

Możesz też zaktualizować kolejność zadań w pojeździe, do którego jest przypisane, a następnie usunąć odpowiednie zadanie z listy przystanków.

Ustawianie lokalizacji wyniku zadania i wyników

Zakończenie zadania nie oznacza powodzenia lub niepowodzenia. Oznacza to, że zadanie nie jest już uważane za ukończone. W przypadku śledzenia przesyłek ważne jest wskazanie rzeczywistego wyniku zadania, aby można było zobaczyć wynik dostawy i naliczyć za nie właściwe płatności. Po ustawieniu tego ustawienia nie możesz zmienić wyniku zadania. Możesz jednak zmienić czas i lokalizację wyników zadania po ich ustawieniu.

Zadania ze stanem ZAMKNIĘTE mogą mieć wynik SUCCEEDED lub FAILED. Fleet Engine nalicza opłaty tylko za zadania związane z dostarczaniem o stanie SUCCEEDED.

Zaznaczając wynik zadania, Fleet Engine automatycznie wypełnia lokalizację miejsca wykonania zadania ostatnią znaną lokalizacją pojazdu. Możesz to zastąpić, wywołując Fleet Engine. Pamiętaj, że nie możesz ustawić lokalizacji wyniku zadania za pomocą pakietu Driver SDK.

Poniższy przykładowy kod pokazuje, jak za pomocą pakietu Driver SDK ustawić wynik zadania i sygnaturę czasową.

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

Wyszukiwanie pojazdu

Możesz wyszukać pojazd za pomocą pakietu Driver SDK. Zanim wyszukasz pojazd, zainicjuj interfejs Delivery Driver API. Możesz wtedy wyszukać pojazd, tak jak w poniższym przykładzie.

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 może wyszukać DeliveryVehicle tylko dla identyfikatora pojazdu, który został podany podczas inicjowania interfejsu Delivery Driver API.