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 kompilacji i zależności

Pakiet SDK sterowników w wersji 4.99 lub nowszej 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 można było używać pakietu Driver SDK, aplikacja musi być kierowana minSdkVersion w wersji 23 lub nowszej. Więcej Więcej informacji zawiera Informacje o wersji

Aby uruchomić aplikację stworzoną za pomocą pakietu Driver SDK, urządzenie musi mieć Usługi Google Play Zainstalowano.

Konfigurowanie projektu programistycznego

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

  1. Utwórz nową konsolę Google Cloud. projekt lub wybierz istniejący projekt do użycia za pomocą pakietu Driver SDK. Zaczekaj kilka minut do nowy projekt będzie widoczny w konsoli Google Cloud.

  2. Aby można było uruchomić aplikację w wersji demonstracyjnej, projekt musi mieć dostęp do pakietu SDK Maps na Androida. W konsoli Google Cloud wybierz Interfejsy API Usługi > Library, a następnie wyszukaj i włącz pakiet SDK Maps dla na urządzeniu z Androidem.

  3. Wybierz, aby pobrać klucz interfejsu API dla projektu Interfejsy API Usługi > Dane logowania > Utwórz dane logowania > API. Więcej informacji o uzyskiwaniu klucza interfejsu API znajdziesz w artykule Uzyskaj klucz interfejsu API.

Dodaj pakiet Driver SDK do aplikacji

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

  1. Dodaj tę zależność do konfiguracji Gradle lub Maven: zastępując zmienną VERSION_NUMBER wybraną wersją pakietu Driver SDK.

    Gradle

    Dodaj do build.gradle:

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

    Maven

    Dodaj do pom.xml:

    <dependencies>
      ...
      <dependency>
        <groupId>com.google.android.libraries.mapsplatform.transportation</groupId>
        <artifactId>transportation-driver</artifactId>
        <version>VERSION_NUMBER</version>
      </dependency>
    </dependencies>
    
  2. Pakiet Driver SDK korzysta z pakietu Navigation SDK. Ta zależność jest skonfigurowana w takim jeśli potrzebna jest konkretna wersja Navigation SDK, musi być jawnie zdefiniowane w pliku konfiguracji kompilacji w ten sposób: Pominięcie wspomnianego bloku kodu sprawi, że projekt będzie zawsze pobierany najnowszą wersję pakietu Navigation SDK w głównej wersji produkcyjnej. Pamiętaj, że połączone zachowania najnowszych wersji pakietu Driver SDK oraz Pakiet Navigation SDK został rygorystycznie przetestowany przed opublikowaniem.

    Uporządkuj konfigurację zależności w środowisku programistycznym i wersji z odpowiednimi środowiskami.

    Gradle

    Dodaj do build.gradle:

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

    Maven

    Dodaj do pom.xml:

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

Zaktualizuj plik manifestu aplikacji

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

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

Na przykład zastąp PASTE_YOUR_API_KEY_HERE swoim kluczem interfejsu API w następujących 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 źródłach

Jeśli w swojej aplikacji używasz pakietu Driver SDK, musisz dodać tekstu informacji o źródle i licencji open source jako część informacji prawnych dotyczących aplikacji. . Informacje o autorach najlepiej jest dodawać jako niezależną pozycję menu lub jako w menu Informacje.

Informacje o licencjach można znaleźć w pliku „third_party_licenses.txt”. zapisz w niezarchiwizowanego pliku AAR.

Wejdź na https://developers.google.com/android/guides/opensource. jak uwzględniać powiadomienia open source.

Zależności

Pakiet Driver SDK używa gRPC na komunikują się z serwerem Fleet Engine. Jeśli nie wdrożysz jeszcze gRPC, może być konieczne 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 Driver SDK będzie występują błędy w czasie działania podczas próby komunikacji z serwerem Fleet Engine.

Jeśli używasz ProGuard do zoptymalizować kompilacje, być może trzeba będzie dodać do ProGuard te wiersze: plik konfiguracyjny:

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

Minimalny obsługiwany poziom interfejsu API to 23.

Inicjowanie pakietu SDK

Identyfikator dostawcy (zwykle identyfikator projektu Google Cloud) jest wymagany do zainicjować obiekt FleetEngine. Więcej informacji o konfigurowaniu Cloud Project, patrz Authentication and Authorization (Uwierzytelnianie i autoryzacja).

Przed rozpoczęciem korzystania z pakietu Driver SDK musisz zainicjować pakiet SDK do nawigacji. Aby zainicjować pakiet SDK:

  1. Uzyskaj obiekt Navigator z 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. Zainicjuj obiekt *DriverApi za pomocą obiektu DriverContext.

    DeliveryDriverApi driverApi = DeliveryDriverApi.createInstance(driverContext);
    
  4. Uzyskaj DeliveryVehicleReporter z obiektu interfejsu API. (DeliveryVehicleReporter przedłuża się o NavigationVehicleReporter).

    DeliveryVehicleReporter vehicleReporter = driverApi.getDeliveryVehicleReporter();
    

Uwierzytelnianie za pomocą AuthTokenFactory

Gdy pakiet Driver SDK generuje aktualizacje lokalizacji, musi wysyłać te aktualizacje do na serwerze Google Fleet Engine. Do uwierzytelniania tych żądań Pakiet SDK sterownika wywołuje komponent wywołujący wystąpienia AuthTokenFactory. Za generowanie tokenów uwierzytelniania w lokalizacji odpowiada fabryka godzinę aktualizacji.

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

  • Pobierz token uwierzytelniania, prawdopodobnie w formacie JSON, z serwera HTTPS.
  • Przeanalizuj token i zapisz go w pamięci podręcznej.
  • Odśwież token po jego wygaśnięciu.

Szczegółowe informacje o tokenach oczekiwanych przez serwer Fleet Engine znajdziesz w sekcji Tworzenie tokena internetowego JSON (JWT) na potrzeby autoryzacji

Oto szkielet implementacji obiektu 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);
    }
  }
}

Ta konkretna implementacja wykorzystuje wbudowanego klienta HTTP w Javie do pobrania z serwera uwierzytelniania dewelopera. Tokenem jest zapisane do ponownego wykorzystania. Token zostanie pobrany ponownie, jeśli stary token zostanie znaleziony w ciągu 10 minut. po jego upływie.

Implementacja może działać inaczej, np. używać wątku działającego w tle aby odświeżyć tokeny.

Wyjątki w AuthTokenFactory są traktowane jako przejściowe, chyba że mają miejsce kilka razy. Po kilku próbach pakiet Driver SDK przyjmuje, że błąd jest trwały i przestaje próbować wysyłać aktualizacje.

Raportowanie stanu i błędów za pomocą usługi StatusListener

Pakiet Driver SDK wykonuje działania w w tle, użyj funkcji StatusListener, aby otrzymywać powiadomienia, gdy takich jak błędy, ostrzeżenia czy komunikaty debugowania. Błędy mogą być przejściowy (np. BACKEND_CONNECTIVITY_ERROR) lub mogą powodują trwałe zatrzymanie aktualizacji lokalizacji (np. VEHICLE_NOT_FOUND, oznaczający błąd konfiguracji).

Udostępniasz opcjonalną implementację StatusListener:

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 protokołu SSL/TLS

Wewnętrznie implementacja pakietu Driver SDK używa Bezpieczna komunikacja z użyciem SSL/TLS z serwerem Fleet Engine. Wcześniejsze wersje Androida (wersje interfejsu API 23 lub wcześniej) mogą wymagać Poprawka SecurityProvider do komunikacji z serwerem. Więcej informacji na temat pracy z protokołem SSL w Androidzie, zobacz Zaktualizuj dostawcę zabezpieczeń, aby chronić się przed atakami SSL. Artykuł zawiera też przykładowy kod służący do instalowania poprawek u dostawcy zabezpieczeń.

Włącz aktualizacje lokalizacji

Jeśli masz instancję *VehicleReporter, włączenie aktualizacji lokalizacji będzie proste:

DeliveryVehicleReporter reporter = ...;

reporter.enableLocationTracking();

Aktualizacje lokalizacji są wysyłane w miarę możliwości w regularnych odstępach czasu. Każda lokalizacja wskazuje też, że pojazd jest online.

Domyślny interwał raportowania wynosi 10 sekund, ale możesz zmienić interwał raportowania z FleetEngine.setLocationReportingInterval(long, TimeUnit) Minimalne obsługiwany interwał aktualizacji wynosi 5 sekund. Częstsze aktualizacje mogą Wolniejsze żądania i błędy.

Wyłącz aktualizacje lokalizacji

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

Przypadki użycia modelu zaufanego

W tej sekcji opisujemy, jak wdrożyć pakiet Driver SDK do typowych przypadków użycia. w przypadku korzystania z zaufanego modelu.

Utwórz pojazd

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

Zanim utworzysz pojazd, wykonaj te czynności: zainicjować interfejs Delivery Driver API. Identyfikator pojazdu należy utworzyć za pomocą użytych identyfikatorów pojazdu i dostawcy podczas inicjowania pakietu Driver SDK. Następnie utwórz pojazd, jak pokazano na ilustracji. 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 dostawy możesz utworzyć za pomocą pakietu Driver SDK.

Zanim utworzysz zadanie, zainicjować interfejs Delivery Driver API. Zadanie należy utworzyć przy użyciu identyfikatora dostawcy określonego w pakiecie Driver SDK jego zainicjowanie. Następnie utwórz zadanie odbioru przesyłki w następujący sposób: przykład. Informacje 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_PICKUP)
   .build();

try {
   DeliveryTask task = taskManager.createTask(request).get();
   // Handle CreateTaskRequest DeliveryTask response.
} catch (Exception e)  {
   // Handle CreateTaskRequest error.
}

Tworzenie zadania dostawy

Zadanie dostawy możesz utworzyć za pomocą pakietu Driver SDK.

Zanim utworzysz zadanie, zainicjować interfejs Delivery Driver API. Następnie utwórz zadanie dostawy, jak pokazano w przykładzie poniżej. Informacje 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_DELIVERY)
   .build();
try {
   DeliveryTask task = taskManager.createTask(request).get();
   // Handle CreateTaskRequest DeliveryTask response.
} catch (Exception e)  {
   // Handle CreateTaskRequest error.
}

Zaplanowana niedostępność

Możesz utworzyć zadanie wskazujące niedostępność (na przykład dla kierowcy awarii lub uzupełniania pojazdu) za pomocą pakietu Driver SDK. Zaplanowana niedostępność zadanie nie może zawierać identyfikatora śledzenia. Możesz opcjonalnie podać lokalizację.

Zanim utworzysz zadanie, zainicjować interfejs Delivery Driver API. Następnie utwórz zadanie dotyczące niedostępności zgodnie z poniższym przykładem. Informacje 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)
   .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ć za pomocą pakietu Driver SDK. Zaplanowany zadanie zatrzymania nie może zawierać identyfikatora śledzenia.

Zanim utworzysz zadanie, zainicjować interfejs Delivery Driver API. Następnie utwórz zaplanowane zadanie zatrzymania zgodnie z poniższym przykładem. Informacje 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)
   .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ń

Kolejność wykonywania zadań przypisanych do pojazdu możesz zaktualizować w Pakiet SDK sterownika.

Zaktualizowanie kolejności zadań powoduje też przypisanie zadań do pojazdu, jeśli nie były przypisany wcześniej do pojazdu. Zamykają też zadania, które były wcześniej zostały przypisane do pojazdu i nie zostały uwzględnione w zaktualizowanej kolejności. Przypisanie do innego pojazdu, jeśli zostało wcześniej przypisane do innego pojazdu. . Zanim przypiszesz zadanie do nowego pojazdu, zamknij istniejące zadanie, a następnie utworzyć nowe.

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

Zanim zaktualizujesz kolejność zadań pojazdu, upewnij się, że pojazd i Zadania zostały już utworzone we Fleet Engine. Następnie zmień kolejność zadań dla pojazdu, jak pokazano w przykładzie 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.
}

Może wystąpić wyjątek, który uniemożliwia aktualizację do wewnętrznego stanu pakietu Driver SDK. Jeśli tak się stanie, rozwiąż problem, a następnie Wywołaj ponownie setVehicleStops, dopóki nie zostanie nawiązane.

Możliwe problemy:

  • Określone wartości VehicleStops nie są zgodne z prawidłowym wzorcem. Tylko pierwszy Wartość VehicleStop może być podana w dowolnym z tych stanów: NEW, ENROUTE lub ARRIVED (NOWY, ENROUTE). Zatrzymanie pojazdu po obecnym przystanku musi mieć stan NEW VehicleStopState.

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

  • Pojazd nie istnieje.

Pojazd jest w drodze do następnego przystanku

Należy powiadamiać Fleet Engine, gdy pojazd odjeżdża z przystanku oraz kiedy rozpoczyna nawigację. Możesz powiadomić Fleet Engine za pomocą pakietu Driver SDK.

Zanim powiadomisz Fleet Engine o tym, że pojazd wyruszył z przystanku, upewnij się, że: utworzone i ustawione przystanki pojazdu. Następnie powiadom Fleet Engine o odjazd pojazdu, jak pokazano w przykładzie poniżej.

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ę pakietu SDK sterownika sterownika i stan wewnętrzny. Jeśli tak się stanie, rozwiąż problem, a następnie zadzwoń enrouteToNextStop, dopóki nie zakończy się pomyślnie.

Możliwe problemy:

  • W pakiecie SDK Driver SDK nie ma ustawionych żadnych elementów VehicleStops.

Pojazd zbliża się do przystanku

Musisz powiadamiać Fleet Engine, gdy pojazd znajdzie się na przystanku. Dostępne opcje powiadamia Fleet Engine z pakietu Driver SDK.

Zanim powiadomisz Fleet Engine o zatrzymaniu pojazdu, upewnij się, że ustawiono przystanki. Następnie powiadom Fleet Engine o przybyciu pojazdu jak 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.
}

Może wystąpić wyjątek, który może uniemożliwić aktualizację wewnętrznego pakietu SDK sterownika sterownika state. Jeśli tak się stanie, rozwiąż problem, a następnie zadzwoń ponownie pod numer arrivedAtStop aż proces się zakończy.

Możliwe problemy:

  • W pakiecie SDK Driver SDK nie ma ustawionych żadnych elementów VehicleStops.

Pojazd zatrzymuje się

Gdy pojazd się zatrzyma. Powoduje to, że wszystkie dotyczące zadań związanych z przystankiem zostaną ustawione na ZAMKNIĘTE. Możesz powiadomić flotę Mechanizm z pakietu Driver SDK.

Powiadom Fleet Engine, że pojazd zakończył działanie VehicleStop, jak pokazano w następujący przykład.

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

Może wystąpić wyjątek, który może uniemożliwić aktualizację wewnętrznego pakietu SDK sterownika sterownika state. Jeśli tak się stanie, rozwiąż problem, a następnie zadzwoń ponownie pod numer completedStop aż proces się zakończy.

Możliwe problemy:

  • W pakiecie SDK Driver SDK nie ma ustawionych żadnych elementów VehicleStops.

Zamykanie zadania

Aby zamknąć zadanie przypisane do pojazdu, powiadom Fleet Engine że pojazd zakończył zatrzymanie na miejscu, w którym odbywa się zadanie, lub usunąć go z listy postojów. W tym celu możesz ustawić listę a pozostały pojazd zatrzymuje się zmianie kolejności zadań w pojeździe.

Jeśli do zadania nie przypisano jeszcze pojazdu i trzeba je zamknąć, zaktualizuj do stanu ZAMKNIĘTE. Nie można jednak ponownie otworzyć ZAMKNIĘTEGO zadania.

Zamknięcie zadania nie oznacza powodzenia ani niepowodzenia. Wskazuje on, że zadanie jest już uważany za nierozstrzygnięty. Aby śledzić przesyłkę, ważne jest: wskazują rzeczywisty wynik zadania, aby można było poznać efekt realizacji zadania.

Aby można było korzystać z pakietu Driver SDK, zadanie musi być przypisane do pojazdu aby zamknąć zadanie. Aby zamknąć zadanie przypisane do pojazdu, powiadom o tym Fleet Engine, że pojazd zakończył zatrzymanie, na którym odbywa się zadanie.

Możesz też zaktualizować kolejność zadań w pojeździe przypisane zadanie, a następnie usuń je z listy przystanki.

Określanie wyniku i lokalizacji zadania

Zamknięcie zadania nie oznacza powodzenia ani niepowodzenia. Wskazuje on, że zadanie jest już uważany za nierozstrzygnięty. Aby śledzić przesyłkę, ważne jest, wskazują rzeczywisty wynik zadania, aby można było poznać rezultaty realizacji zadania – czyli czy opłaty za usługi są naliczane. Po jej skonfigurowaniu nie można zmienić w wyniku wykonania zadania. Możesz jednak zmienić czas i lokalizację wyniku zadania po ich skonfigurowaniu.

Zadania, które są w stanie ZAMKNIĘTE, mogą mieć następujące wyniki: ZAKOŃCZONO lub NIEUDAŁO SIĘ. Fleet Engine nalicza opłaty tylko za zadania dostawy ze stanem UDAŁO SIĘ.

Podczas oznaczania wyniku zadania Fleet Engine automatycznie wypełnia to zadanie lokalizację wyniku z ostatnią znaną lokalizacją pojazdu. Możesz to zmienić przez wywołanie Fleet Engine. Pamiętaj, że nie możesz ustawić lokalizacji wyniku zadania za pomocą pakietu Driver SDK.

Ten przykładowy kod pokazuje, jak skonfigurować zadanie za pomocą pakietu Driver SDK wyniku i sygnatury czasowej.

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

Wyszukaj pojazd

Możesz wyszukać pojazd za pomocą pakietu Driver SDK. Zanim wyszukasz pojazd, upewnij się, że zainicjować interfejs Delivery Driver API. Następnie możesz wyszukać pojazd, jak pokazano w przykładzie poniżej.

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 wyszukiwać tylko DeliveryVehicle dla identyfikatora pojazdu podanego podczas inicjowania interfejsu Delivery Driver API.