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 na ten region: minSdkVersion
23 lub więcej. Więcej informacji:
Informacje o wersji
Aby uruchomić aplikację stworzoną przy użyciu pakietu Driver SDK, urządzenie z Androidem 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:
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.
Aby 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.
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:
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.driver</groupId> <artifactId>transportation-driver</artifactId> <version>[VERSION_NUMBER]</version> </dependency> </dependencies>
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>
Dodawanie klucza interfejsu API do aplikacji
Po dodaniu do aplikacji pakietu Driver SDK dodaj do niej klucz interfejsu API. Ty musi używać klucza interfejsu API projektu uzyskanego podczas skonfigurować projekt programistyczny.
W tej sekcji opisano, jak przechowywać klucz interfejsu API w celu zwiększenia jego bezpieczeństwa
przywoływanych przez aplikację. Nie sprawdzaj klucza interfejsu API do wersji
systemu sterowania. Powinien on być zapisany w pliku local.properties
, który jest
znajduje się w katalogu głównym projektu. Więcej informacji na temat
local.properties
, patrz
Pliki właściwości Gradle.
Aby uprościć to zadanie, użyj Wtyczka Gradle obiektów tajnych na Androida. Wykonaj tę procedurę, aby zainstalować wtyczkę Gradle obiektów tajnych i bezpiecznie przechowywać klucz interfejsu API.
Otwórz plik
build.gradle
na poziomie głównym i dodaj ten kod do sekcjidependencies
w kolumniebuildscript
.Zakręcony
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") } }
Otwórz plik
build.gradle
na poziomie aplikacji i dodaj ten kod do sekcjiplugins
.Zakręcony
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
Kotlin
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
Otwórz
local.properties
w katalogu na poziomie projektu i dodaj do tego kodu. Pamiętaj, aby zastąpićYOUR_API_KEY
kluczem interfejsu API.MAPS_API_KEY=YOUR_API_KEY
W pliku
AndroidManifest.xml
przejdź do sekcjicom.google.android.geo.API_KEY
i zaktualizuj atrybutandroid:value
w następujący sposób:<meta-data android:name="com.google.android.geo.API_KEY" android:value="${MAPS_API_KEY}" />
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="${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>
Umieść w aplikacji wymagane informacje o źródłach
Jeśli w swojej aplikacji używasz pakietu Driver SDK, musisz dodać teksty informacji o źródle i licencje 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 może 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 DriverContext
. Więcej informacji o konfigurowaniu
Projekt Google Cloud, zobacz
Authentication and Authorization (Uwierzytelnianie i autoryzacja).
Zanim zaczniesz używać pakietu Driver SDK, musisz najpierw zainicjować pakiet SDK do nawigacji. Aby zainicjować pakiet SDK:
Uzyskaj obiekt
Navigator
zNavigationApi
.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; } } );
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();
Zainicjuj obiekt
*DriverApi
za pomocą obiektuDriverContext
.DeliveryDriverApi driverApi = DeliveryDriverApi.createInstance(driverContext);
Uzyskaj
DeliveryVehicleReporter
z obiektu interfejsu API. (DeliveryVehicleReporter
przedłuża się oNavigationVehicleReporter
).DeliveryVehicleReporter vehicleReporter = driverApi.getDeliveryVehicleReporter();
Uwierzytelnianie w sieci AuthTokenFactory
Gdy pakiet Driver SDK generuje aktualizacje lokalizacji,
musi wysyłać te aktualizacje do
z serwera 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:
- pobranie tokena uwierzytelniania, prawdopodobnie w formacie JSON, z serwera HTTPS
- przeanalizować token i przechowywać go w pamięci podręcznej
- odświeżaj 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 szkieletowa implementacja elementu 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 tymczasowe, jeśli nie mają miejsca
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
SSL/TLS do bezpiecznej komunikacji z serwerem Fleet Engine. Wcześniejsze wersje
Androida (wersja API 23 lub
wcześniej) może wymagać poprawki SecurityProvider
do komunikacji z
serwera. Więcej informacji na temat pracy z protokołem SSL w Androidzie znajdziesz w artykule
Dostawca zabezpieczeń GMS.
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. Możesz zmienić
interwał z funkcją reporter.setLocationReportingInterval(long, TimeUnit)
.
minimalny obsługiwany interwał aktualizacji to 5 sekund. Częstsze aktualizacje mogą
co skutkuje wolniejszym wysyłaniem żądań i błędami.
Wyłącz aktualizacje lokalizacji
Po zakończeniu zmiany kierowcy możesz zatrzymać aktualizacje lokalizacji, dzwoniąc pod
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żytego identyfikatora 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 może nie 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
stanu. 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ę
Musisz powiadomić Fleet Engine o zakończeniu zatrzymania pojazdu. To powiadomienie powoduje, że wszystkie zadania powiązane z przystankiem zostają ustawione na ZAMKNIĘTE. Dostępne opcje powiadamia Fleet Engine 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
stanu. 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 nie jest już uważane za w toku. 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Ę.
Zaznaczając wynik zadania, Fleet Engine automatycznie wypełnia pole lokalizację wyniku zadania z ostatnią znaną lokalizacją pojazdu. Możesz zastąpić tego działania.
Ten przykład pokazuje, jak ustawić wynik zadania za pomocą pakietu Driver SDK i sygnaturę czasową. Nie możesz ustawiać lokalizacji wyników zadania za pomocą pakietu Driver SDK.
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.