Persyaratan sistem minimum
Perangkat seluler harus menjalankan Android 6.0 (API level 23) atau yang lebih baru.
Konfigurasi build dan dependensi
Driver SDK versi 4.99 dan yang lebih baru tersedia di repositori Maven Google.
Gradle
Tambahkan baris berikut ke file build.gradle
Anda:
repositories {
...
google()
}
Maven
Tambahkan baris berikut ke file pom.xml
Anda:
<project>
...
<repositories>
<repository>
<id>google-maven-repository</id>
<url>https://maven.google.com</url>
</repository>
</repositories>
...
</project>
Konfigurasi Project
Untuk menggunakan Driver SDK, aplikasi Anda harus menargetkan minSdkVersion
23 atau lebih tinggi. Untuk informasi selengkapnya, lihat
Catatan Rilis.
Untuk menjalankan aplikasi yang dibangun dengan Driver SDK, perangkat Android harus memiliki Layanan Google Play terinstal.
Menyiapkan project pengembangan
Untuk menyiapkan project pengembangan dan mendapatkan kunci API untuk project di Konsol Google Cloud:
Buat Konsol Google Cloud baru project, atau pilih project yang sudah ada, untuk digunakan dengan Driver SDK. Tunggu beberapa menit sampai project baru dapat dilihat di Konsol Google Cloud.
Untuk menjalankan aplikasi demo, project Anda harus memiliki akses ke Maps SDK untuk Android. Di Konsol Google Cloud, pilih API & Layanan > Library, lalu telusuri dan aktifkan Maps SDK untuk Android.
Dapatkan kunci API untuk project dengan memilih API & Layanan > Kredensial > Buat kredensial > Kunci API Anda. Untuk informasi selengkapnya tentang mendapatkan kunci API, lihat Mendapatkan kunci API.
Menambahkan Driver SDK ke aplikasi
Driver SDK tersedia dari repositori Maven Google. Tujuan yang berisi file Project Object Model (.pom) SDK dan Javadocs. Untuk menambahkan Driver SDK ke aplikasi Anda:
Tambahkan dependensi berikut ke konfigurasi Gradle atau Maven Anda, mengganti placeholder
VERSION_NUMBER
dengan versi yang dipilih Driver SDK.Gradle
Tambahkan kode berikut ke
build.gradle
Anda:dependencies { ... implementation 'com.google.android.libraries.mapsplatform.transportation:transportation-driver:[VERSION_NUMBER]' }
Maven
Tambahkan kode berikut ke
pom.xml
Anda:<dependencies> ... <dependency> <groupId>com.google.android.libraries.mapsplatform.transportation.driver</groupId> <artifactId>transportation-driver</artifactId> <version>[VERSION_NUMBER]</version> </dependency> </dependencies>
Driver SDK bergantung pada Navigation SDK, dan dependensi ini dikonfigurasi sedemikian rupa sehingga jika diperlukan versi Navigation SDK tertentu, SDK harus secara eksplisit di file konfigurasi build seperti berikut, menghilangkan blok kode yang disebutkan akan memungkinkan project untuk selalu mendownload versi terbaru Navigation SDK dalam versi rilis utama. Perhatikan bahwa perilaku gabungan dari versi terbaru SDK Driver dan Navigation SDK telah menjalani pengujian ketat sebelum dirilis.
Mengatur konfigurasi dependensi pengembangan dan rilis Anda lingkungan yang sesuai.
Gradle
Tambahkan kode berikut ke
build.gradle
Anda:dependencies { ... implementation 'com.google.android.libraries.navigation:navigation:5.0.0' }
Maven
Tambahkan kode berikut ke
pom.xml
Anda:<dependencies> ... <dependency> <groupId>com.google.android.libraries.navigation</groupId> <artifactId>navigation</artifactId> <version>5.0.0</version> </dependency> </dependencies>
Menambahkan kunci API ke aplikasi
Setelah menambahkan Driver SDK ke aplikasi Anda, tambahkan kunci API ke aplikasi Anda. Anda harus menggunakan kunci API project yang Anda peroleh saat menyiapkan project pengembangan.
Bagian ini menjelaskan cara menyimpan kunci API sehingga dapat lebih aman
yang direferensikan oleh aplikasi Anda. Anda tidak boleh memasukkan kunci API ke versi Anda
sistem kontrol. Data tersebut harus disimpan di file local.properties
, yang
yang terletak di direktori {i>
root<i} proyek Anda. Untuk informasi selengkapnya tentang
File local.properties
, lihat
File properti Gradle.
Untuk menyederhanakan tugas ini, gunakan Plugin Secrets Gradle untuk Android. Ikuti prosedur ini untuk menginstal plugin Secrets Gradle dan menyimpan dengan aman kunci API Anda.
Buka file
build.gradle
tingkat root dan tambahkan kode berikut ke Elemendependencies
padabuildscript
.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") } }
Buka file
build.gradle
tingkat aplikasi, dan tambahkan kode berikut ke elemenplugins
.Groovy
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
Kotlin
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
Buka
local.properties
pada direktori tingkat project, lalu tambahkan pada kode berikut. Pastikan untuk menggantiYOUR_API_KEY
dengan kunci API Anda.MAPS_API_KEY=YOUR_API_KEY
Di file
AndroidManifest.xml
Anda, bukacom.google.android.geo.API_KEY
dan update atributandroid:value
sebagai berikut:<meta-data android:name="com.google.android.geo.API_KEY" android:value="${MAPS_API_KEY}" />
Contoh berikut menunjukkan manifes lengkap untuk aplikasi contoh:
<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>
Menyertakan atribusi yang diperlukan dalam aplikasi
Jika menggunakan Driver SDK di aplikasi, Anda harus menyertakan teks atribusi dan lisensi open source sebagai bagian dari pemberitahuan hukum aplikasi Anda bagian. Sebaiknya sertakan atribusi sebagai item menu independen atau sebagai bagian dari item menu Tentang.
Informasi lisensi dapat ditemukan di "third_party_licenses.txt" file di file AAR yang tidak diarsipkan.
Lihat https://developers.google.com/android/guides/opensource tentang cara menyertakan pemberitahuan {i>open source<i}.
Dependensi
Driver SDK menggunakan gRPC ke berkomunikasi ke server Fleet Engine. Jika belum menyertakan gRPC, Anda mungkin perlu mendeklarasikan dependensi berikut:
dependencies {
implementation 'io.grpc:grpc-android:1.12.0'
implementation 'io.grpc:grpc-okhttp:1.12.0'
}
Tanpa dependensi ini, Driver SDK dapat mengalami error saat runtime ketika mencoba berkomunikasi dengan server Fleet Engine.
Jika Anda menggunakan ProGuard untuk mengoptimalkan build, Anda mungkin perlu menambahkan baris berikut ke ProGuard file konfigurasi:
-dontwarn com.google.**
-dontwarn io.grpc.**
-dontwarn okio.**
API level minimum yang didukung adalah 23.
Menginisialisasi SDK
ID penyedia (biasanya ID Project Google Cloud) diperlukan untuk
melakukan inisialisasi objek DriverContext
. Untuk detail selengkapnya tentang cara menyiapkan
Project Google Cloud, lihat
Autentikasi dan Otorisasi.
Sebelum menggunakan Driver SDK, Anda harus melakukan inisialisasi terlebih dahulu Navigation SDK. Untuk melakukan inisialisasi SDK:
Dapatkan objek
Navigator
dariNavigationApi
.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; } } );
Buat objek
DriverContext
, dengan mengisi kolom yang wajib diisi.DriverContext driverContext = DriverContext.builder(application) .setProviderId(providerId) .setVehicleId(vehicleId) .setAuthTokenFactory(authTokenFactory) .setNavigator(navigator) .setRoadSnappedLocationProvider( NavigationApi.getRoadSnappedLocationProvider(application)) .build();
Gunakan objek
DriverContext
untuk melakukan inisialisasi*DriverApi
.DeliveryDriverApi driverApi = DeliveryDriverApi.createInstance(driverContext);
Dapatkan
DeliveryVehicleReporter
dari objek API. (DeliveryVehicleReporter
memperluasNavigationVehicleReporter
.)DeliveryVehicleReporter vehicleReporter = driverApi.getDeliveryVehicleReporter();
Mengautentikasi dengan AuthTokenFactory
Saat Driver SDK membuat pembaruan lokasi,
sistem harus mengirimkan
pembaruan tersebut ke
server Fleet Engine. Untuk mengautentikasi permintaan ini,
Driver SDK melakukan panggilan ke nomor yang disediakan penelepon
dari instance AuthTokenFactory
.
Factory bertanggung jawab untuk membuat token autentikasi di lokasi
waktu update.
Cara token dibuat secara pasti berbeda-beda untuk setiap situasi developer. Namun, penerapannya mungkin perlu:
- mengambil token autentikasi, mungkin dalam format JSON, dari server HTTPS
- mengurai dan meng-cache token
- memperbarui token jika masa berlakunya telah habis
Untuk detail tentang token yang diharapkan oleh server Fleet Engine, lihat Membuat Token Web JSON (JWT) untuk otorisasi.
Berikut adalah implementasi kerangka 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);
}
}
}
Implementasi khusus ini menggunakan klien HTTP Java bawaan untuk mengambil token dalam format JSON dari server autentikasi developer. Token tersebut adalah disimpan untuk digunakan kembali. Token diambil ulang jika token lama berada dalam waktu 10 menit tentang waktu habis masa berlakunya.
Implementasi Anda mungkin melakukan hal-hal yang berbeda, seperti menggunakan thread latar belakang untuk memperbarui token.
Pengecualian di AuthTokenFactory
diperlakukan sebagai sementara kecuali jika terjadi
berulang kali. Setelah beberapa kali percobaan, Driver SDK
mengasumsikan bahwa kesalahan bersifat permanen dan berhenti mencoba mengirim pembaruan.
Pelaporan Status dan Error dengan StatusListener
Karena Driver SDK melakukan tindakan dalam
latar belakang, gunakan StatusListener
untuk memicu notifikasi saat
terjadi, seperti error, peringatan, atau pesan debug. Error mungkin
bersifat sementara (seperti BACKEND_CONNECTIVITY_ERROR
), atau mungkin
menyebabkan pembaruan lokasi dihentikan secara permanen (seperti VEHICLE_NOT_FOUND
,
yang menunjukkan error konfigurasi).
Anda menyediakan implementasi StatusListener
opsional seperti berikut:
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.
}
}
Catatan tentang SSL/TLS
Secara internal, implementasi Driver SDK menggunakan
SSL/TLS untuk berkomunikasi secara aman dengan server Fleet Engine. Versi sebelumnya
Android (API versi 23 atau
sebelumnya) mungkin memerlukan patch SecurityProvider
untuk berkomunikasi dengan
server tertentu. Untuk informasi selengkapnya tentang menggunakan SSL di Android, lihat
Penyedia GMS Keamanan.
Artikel ini juga berisi contoh kode untuk melakukan patch pada penyedia keamanan.
Aktifkan pembaruan lokasi
Setelah Anda memiliki instance *VehicleReporter
, mengaktifkan pembaruan lokasi adalah
langsung:
DeliveryVehicleReporter reporter = ...;
reporter.enableLocationTracking();
Pembaruan lokasi dikirim dengan interval rutin, jika memungkinkan. Setiap lokasi {i>update <i}juga menunjukkan bahwa kendaraan sedang {i>online<i}.
Secara default, interval pelaporan adalah 10 detik. Anda dapat mengubah pelaporan
dengan reporter.setLocationReportingInterval(long, TimeUnit)
. Tujuan
interval update minimum yang didukung adalah 5 detik. Pembaruan yang lebih sering dapat
menyebabkan permintaan dan error menjadi lebih lambat.
Menonaktifkan pembaruan lokasi
Saat giliran pengemudi selesai, Anda dapat menghentikan pembaruan lokasi dengan memanggil
DeliveryVehicleReporter.disableLocationTracking
.
Kasus penggunaan model tepercaya
Bagian ini menjelaskan cara menggunakan Driver SDK untuk menerapkan kasus penggunaan umum saat menggunakan model tepercaya.
Buat kendaraan
Anda dapat membuat kendaraan dari Driver SDK.
Sebelum membuat kendaraan, pastikan untuk melakukan inisialisasi Delivery Driver API. ID kendaraan harus dibuat dengan ID kendaraan dan penyedia yang digunakan selama inisialisasi Driver SDK. Kemudian, buat kendaraan seperti yang ditunjukkan dalam contoh berikut:
DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleManager vehicleManager = api.getDeliveryVehicleManager();
try {
DeliveryVehicle vehicle = vehicleManager.createVehicle().get();
// Handle CreateVehicleRequest DeliveryVehicle response.
} catch (Exception e) {
// Handle CreateVehicleRequest error.
}
Membuat tugas pengambilan pengiriman
Anda dapat membuat tugas pengambilan kiriman dari Driver SDK.
Sebelum membuat tugas, pastikan untuk melakukan inisialisasi Delivery Driver API. Tugas harus dibuat menggunakan ID penyedia yang ditentukan selama Driver SDK inisialisasi. Kemudian, buat tugas pengambilan pengiriman seperti yang ditampilkan di bawah ini contoh. Untuk informasi tentang ID tugas, lihat contoh ID Tugas.
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.
}
Membuat tugas pengiriman pengiriman
Anda dapat membuat tugas pengiriman pengiriman dari Driver SDK.
Sebelum membuat tugas, pastikan untuk melakukan inisialisasi Delivery Driver API. Lalu, buat tugas pengiriman seperti yang ditunjukkan pada contoh berikut. Untuk informasi tentang ID tugas, lihat Contoh ID tugas.
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.
}
Ketidaktersediaan terjadwal
Anda dapat membuat tugas yang menunjukkan ketidaktersediaan (misalnya, untuk pengemudi atau mengisi bahan bakar kendaraan) dari Driver SDK. Ketidaktersediaan terjadwal tidak boleh menyertakan ID pelacakan. Anda dapat memberikan lokasi secara opsional.
Sebelum membuat tugas, pastikan untuk melakukan inisialisasi Delivery Driver API. Kemudian buat tugas ketidaktersediaan seperti yang ditunjukkan pada contoh berikut. Untuk informasi tentang ID tugas, lihat Contoh ID tugas.
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.
}
Perhentian terjadwal
Anda dapat membuat tugas perhentian terjadwal dari Driver SDK. Jadwal berhenti mungkin tidak menyertakan ID pelacakan.
Sebelum membuat tugas, pastikan untuk melakukan inisialisasi Delivery Driver API. Kemudian buat tugas perhentian terjadwal seperti yang ditunjukkan pada contoh berikut. Untuk informasi tentang ID tugas, lihat Contoh ID tugas.
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.
}
Perbarui pengurutan tugas
Anda dapat memperbarui urutan pelaksanaan tugas yang ditetapkan ke kendaraan dari Driver SDK.
Memperbarui pengurutan tugas juga akan menetapkan tugas ke kendaraan jika tidak yang sebelumnya ditetapkan untuk sebuah kendaraan. Hal ini juga menutup tugas yang sebelumnya ditempatkan pada kendaraan dan tidak dicakup dalam pemesanan yang diperbarui. Menugaskan tugas ke kendaraan yang berbeda jika sebelumnya telah ditugaskan ke kendaraan lain kendaraan menyebabkan error. Sebelum menugaskan tugas ke kendaraan baru, tutup tugas yang ada dan kemudian membuat tugas baru.
Anda dapat memperbarui pengurutan tugas kapan saja.
Sebelum memperbarui pemesanan tugas untuk kendaraan, pastikan bahwa kendaraan tersebut dan tugas sudah dibuat di Fleet Engine. Kemudian perbarui urutan tugas untuk kendaraan seperti yang ditunjukkan pada contoh berikut.
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.
}
Mungkin terjadi pengecualian yang dapat mencegah update
ke status internal Driver SDK. Jika ini terjadi, selesaikan
masalahnya, lalu
panggil setVehicleStops
lagi sampai panggilan berhasil.
Potensi masalah dapat mencakup:
VehicleStop yang ditentukan tidak mengikuti pola yang valid. Hanya yang pertama VehicleStop dapat berada di salah satu VehicleStopState: BARU, ENROUTE, atau ARRIVED. VehicleStopState setelah perhentian saat ini harus berada di VehicleStopState BARU.
Tugas tidak ada, atau tugas tersebut milik kendaraan lain.
Kendaraan tidak ada.
Kendaraan sedang dalam perjalanan ke perhentian berikutnya
Fleet Engine harus diberi tahu saat kendaraan berangkat dari perhentian, dan kapan itu memulai navigasi. Anda dapat memberi tahu Fleet Engine dari Driver SDK.
Sebelum memberi tahu Fleet Engine bahwa kendaraan berangkat dari perhentian, pastikan bahwa perhentian kendaraan telah dibuat dan ditetapkan. Lalu beri tahu Fleet Engine tentang waktu keberangkatan kendaraan seperti ditunjukkan dalam contoh berikut.
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.
}
Mungkin terjadi pengecualian yang dapat mencegah update pada Driver SDK
status internal. Jika ini terjadi, selesaikan masalahnya, lalu hubungi
enrouteToNextStop
lagi sampai berhasil.
Potensi masalah dapat mencakup:
- Tidak ada
VehicleStops
tersisa yang ditetapkan di Driver SDK.
Kendaraan tiba di perhentian
Fleet Engine harus diberi tahu saat kendaraan tiba di perhentian. Anda dapat memberi tahu Fleet Engine dari Driver SDK.
Sebelum memberi tahu Fleet Engine bahwa kendaraan tiba di perhentian, pastikan bahwa penghentian kendaraan telah ditetapkan. Lalu beri tahu Fleet Engine tentang kedatangan kendaraan di perhentian seperti yang ditunjukkan dalam contoh berikut.
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.
}
Namun, pengecualian dapat terjadi yang dapat mencegah update pada file internal Driver SDK
status. Jika hal ini terjadi, selesaikan masalah, lalu panggil arrivedAtStop
lagi
sampai berhasil.
Potensi masalah mungkin termasuk:
- Tidak ada
VehicleStops
tersisa yang ditetapkan di Driver SDK.
Kendaraan menyelesaikan perhentian
Anda harus memberi tahu Fleet Engine saat kendaraan berhenti. Notifikasi ini menyebabkan semua tugas yang terkait dengan penghentian ditetapkan ke status TUTUP. Anda dapat memberi tahu Fleet Engine dari Driver SDK.
Beri tahu Fleet Engine bahwa kendaraan telah menyelesaikan VehicleStop-nya seperti yang ditunjukkan di contoh berikut.
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.
}
Namun, pengecualian dapat terjadi yang dapat mencegah update pada file internal Driver SDK
status. Jika hal ini terjadi, selesaikan masalah, lalu panggil completedStop
lagi
sampai berhasil.
Potensi masalah dapat mencakup:
- Tidak ada
VehicleStops
tersisa yang ditetapkan di Driver SDK.
Menutup tugas
Untuk menutup tugas yang telah ditetapkan ke kendaraan, beri tahu Fleet Engine bahwa kendaraan telah menyelesaikan pemberhentian di mana tugas dilakukan, atau menghapusnya dari daftar perhentian kendaraan. Untuk melakukannya, Anda dapat mengatur daftar kendaraan yang tersisa berhenti sama seperti ketika memperbarui pengurutan tugas untuk kendaraan.
Jika tugas belum ditetapkan untuk kendaraan, dan harus ditutup, perbarui tugas ke status TUTUP. Namun, Anda tidak dapat membuka kembali tugas yang TERTUTUP.
Menutup tugas tidak mengindikasikan keberhasilan atau kegagalan. Ini menunjukkan bahwa tugas tidak lagi dianggap selesai. Untuk pelacakan pengiriman, penting untuk menunjukkan hasil aktual dari suatu tugas sehingga hasil pengiriman dapat ditampilkan.
Tugas harus diberikan ke kendaraan agar dapat menggunakan Driver SDK untuk menutup tugas. Untuk menutup tugas yang telah ditetapkan ke kendaraan, beri tahu Fleet Engine bahwa kendaraan telah menyelesaikan perhentian tempat tugas dilakukan.
Atau, perbarui urutan tugas kendaraan tempat tugas diberikan, dan kemudian hapus tugas itu dari daftar berhenti.
Menetapkan hasil tugas dan lokasi hasil
Menutup tugas tidak mengindikasikan keberhasilan atau kegagalan. Ini menunjukkan bahwa tugas tidak lagi dianggap selesai. Untuk pelacakan pengiriman, penting untuk menunjukkan hasil aktual dari suatu tugas sehingga hasil pelaksanaan dapat ditampilkan, sehingga ada penagihan yang sesuai untuk layanan tersebut. Setelah disetel, Anda tidak dapat mengubah hasil tugas. Tetapi Anda dapat memodifikasi waktu hasil tugas dan lokasi hasil tugas setelah Anda menyetelnya.
Tugas yang berstatus DITUTUP dapat memiliki hasil yang ditetapkan ke SUCCEEDED atau GAGAL. Fleet Engine hanya mengenakan biaya pengiriman dengan status SUCCEEDED.
Saat menandai hasil tugas, Fleet Engine secara otomatis mengisi lokasi hasil tugas dengan lokasi kendaraan terakhir yang diketahui. Anda dapat mengganti perilaku ini.
Contoh berikut menunjukkan cara menggunakan Driver SDK untuk menetapkan hasil tugas beserta tanda waktu. Anda tidak dapat menetapkan lokasi hasil tugas menggunakan 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.
}
Cari kendaraan
Anda dapat mencari kendaraan dari Driver SDK. Sebelum mencari sebuah kendaraan, memastikan bahwa Anda melakukan inisialisasi Delivery Driver API. Anda kemudian dapat mencari kendaraan seperti yang ditunjukkan pada contoh berikut.
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
hanya dapat mencari DeliveryVehicle
untuk ID kendaraan yang diberikan selama inisialisasi Delivery Driver API.