Mulai menggunakan Driver SDK untuk Android

Persyaratan sistem minimum

Perangkat seluler harus menjalankan Android 6.0 (level API 23) atau yang lebih baru.

Konfigurasi build dan dependensi

Driver SDK versi 4.99 dan yang lebih baru tersedia dari 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 yang lebih tinggi. Untuk mengetahui informasi selengkapnya, lihat Catatan Rilis.

Untuk menjalankan aplikasi yang dibuat dengan Driver SDK, perangkat Android harus menginstal layanan Google Play.

Menyiapkan project pengembangan

Untuk menyiapkan project pengembangan Anda dan mendapatkan kunci API untuk project tersebut di Konsol Google Cloud:

  1. Buat project Konsol Google Cloud baru, atau pilih project yang sudah ada, untuk digunakan dengan Driver SDK. Tunggu beberapa menit hingga project baru terlihat di Konsol Google Cloud.

  2. Untuk menjalankan aplikasi demo, project Anda harus memiliki akses ke Maps SDK for Android. Di Konsol Google Cloud, pilih APIs & Services > Library, lalu telusuri dan aktifkan Maps SDK for Android.

  3. Dapatkan kunci API untuk project dengan memilih APIs & Services > Credentials > Create credentials > API key. Untuk informasi selengkapnya tentang mendapatkan kunci API, lihat Mendapatkan kunci API.

Menambahkan Driver SDK ke aplikasi

Driver SDK tersedia dari repositori Maven Google. Repositori ini mencakup file Project Object Model (.pom) SDK dan Javadocs. Untuk menambahkan Driver SDK ke aplikasi Anda:

  1. Tambahkan dependensi berikut ke konfigurasi Gradle atau Maven Anda, ganti placeholder VERSION_NUMBER untuk versi Driver SDK yang dipilih.

    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</groupId>
        <artifactId>transportation-driver</artifactId>
        <version>VERSION_NUMBER</version>
      </dependency>
    </dependencies>
    
  2. Driver SDK bergantung pada Navigation SDK, dependensi ini dikonfigurasi sedemikian rupa sehingga jika versi Navigation SDK tertentu diperlukan, dependensi harus secara eksplisit ditentukan dalam file konfigurasi build seperti berikut. Menghapus blok kode yang disebutkan akan memungkinkan project untuk selalu mendownload versi terbaru Navigation SDK dalam versi rilis utama. Perhatikan bahwa perilaku gabungan dari Driver SDK dan Navigation SDK versi terbaru telah melalui pengujian ketat sebelum dirilis.

    Atur konfigurasi dependensi lingkungan pengembangan dan rilis Anda sesuai kebutuhan.

    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>
    

Mengupdate manifes aplikasi

Setelah menambahkan Driver SDK ke aplikasi, Anda dapat mengupdate manifes aplikasi dengan mengedit file AndroidManifest.xml-nya.

Tambahkan kunci API Anda dalam elemen <application>. Anda harus menggunakan kunci API project yang diperoleh saat menyiapkan project pengembangan Anda.

Misalnya, ganti PASTE_YOUR_API_KEY_HERE dengan kunci API Anda di metadata aplikasi berikut:

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

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

Menyertakan atribusi yang diperlukan dalam aplikasi Anda

Jika menggunakan Driver SDK di aplikasi, Anda harus menyertakan teks atribusi dan lisensi open source sebagai bagian dari bagian pemberitahuan hukum aplikasi Anda. Sebaiknya sertakan atribusi sebagai item menu independen atau sebagai bagian dari item menu Tentang.

Informasi lisensi dapat ditemukan di file "third_party_licenses.txt" dalam file AAR yang tidak diarsipkan.

Lihat https://developers.google.com/android/guides/opensource tentang cara menyertakan pemberitahuan open source.

Dependensi

Driver SDK menggunakan gRPC untuk berkomunikasi dengan 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 akan mengalami error saat runtime saat mencoba berkomunikasi dengan server Fleet Engine.

Jika menggunakan ProGuard untuk mengoptimalkan build, Anda mungkin perlu menambahkan baris berikut ke file konfigurasi ProGuard:

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

API level minimum yang didukung adalah 23.

Menginisialisasi SDK

ID penyedia (biasanya Project ID Google Cloud) diperlukan untuk menginisialisasi objek FleetEngine. Untuk mengetahui detail selengkapnya tentang cara menyiapkan Project Google Cloud, lihat Autentikasi dan Otorisasi.

Sebelum menggunakan Driver SDK, Anda harus melakukan inisialisasi Navigation SDK terlebih dahulu. Untuk menginisialisasi SDK:

  1. Dapatkan objek Navigator dari 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. Buat objek DriverContext, yang akan mengisi kolom wajib diisi.

    DriverContext driverContext = DriverContext.builder(application)
                 .setProviderId(providerId)
                 .setVehicleId(vehicleId)
                 .setAuthTokenFactory(authTokenFactory)
                 .setNavigator(navigator)
                 .setRoadSnappedLocationProvider(
                     NavigationApi.getRoadSnappedLocationProvider(application))
                 .build()
    
  3. Gunakan objek DriverContext untuk melakukan inisialisasi *DriverApi.

    DeliveryDriverApi driverApi = DeliveryDriverApi.createInstance(driverContext);
    
  4. Dapatkan DeliveryVehicleReporter dari objek API. (DeliveryVehicleReporter memperluas NavigationVehicleReporter.)

    DeliveryVehicleReporter vehicleReporter = driverApi.getDeliveryVehicleReporter();
    

Autentikasi dengan AuthTokenFactory

Saat Driver SDK menghasilkan pembaruan lokasi, SDK Driver harus mengirimkan pembaruan ini ke server Google Fleet Engine. Untuk mengautentikasi permintaan ini, Driver SDK memanggil instance AuthTokenFactory yang disediakan oleh pemanggil. Factory bertanggung jawab untuk membuat token autentikasi pada waktu pembaruan lokasi.

Cara token dibuat berbeda-beda untuk setiap situasi developer. Namun, implementasi tersebut mungkin perlu:

  • Ambil token autentikasi, yang kemungkinan dalam format JSON, dari server HTTPS.
  • Mengurai dan meng-cache token.
  • Muat ulang token saat masa berlakunya habis.

Untuk mengetahui detail token yang diharapkan oleh server Fleet Engine, lihat Membuat Token Web JSON (JWT) untuk otorisasi.

Berikut adalah implementasi kerangka 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);
    }
  }
}

Implementasi khusus ini menggunakan klien HTTP Java bawaan untuk mengambil token dalam format JSON dari server autentikasi developer. Token disimpan untuk digunakan kembali. Token diambil ulang jika token lama berada dalam waktu 10 menit dari waktu habis masa berlakunya.

Implementasi Anda mungkin melakukan sesuatu yang berbeda, seperti menggunakan thread latar belakang untuk token refresh.

Pengecualian dalam AuthTokenFactory dianggap bersifat sementara kecuali jika terjadi berulang kali. Setelah beberapa kali percobaan, Driver SDK menganggap error tersebut bersifat permanen dan berhenti mencoba mengirim update.

Status dan Error Reporting dengan StatusListener

Karena Driver SDK melakukan tindakan di latar belakang, gunakan StatusListener untuk memicu notifikasi saat peristiwa tertentu terjadi, seperti error, peringatan, atau pesan debug. Error mungkin bersifat sementara (seperti BACKEND_CONNECTIVITY_ERROR), atau dapat menyebabkan update lokasi dihentikan secara permanen (seperti VEHICLE_NOT_FOUND, yang menunjukkan error konfigurasi).

Anda memberikan 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 Android sebelumnya (API versi 23 atau yang lebih lama) mungkin memerlukan patch SecurityProvider untuk berkomunikasi dengan server. Untuk informasi selengkapnya tentang menggunakan SSL di Android, lihat Mengupdate penyedia keamanan agar terlindung dari eksploitasi SSL. Artikel ini juga berisi contoh kode untuk menerapkan patch pada penyedia keamanan.

Aktifkan pembaruan lokasi

Setelah Anda memiliki instance *VehicleReporter, mengaktifkan pembaruan lokasi dapat langsung dilakukan:

DeliveryVehicleReporter reporter = ...;

reporter.enableLocationTracking();

Pembaruan lokasi dikirim dengan interval rutin, jika memungkinkan. Setiap pembaruan lokasi juga menunjukkan bahwa kendaraan online.

Secara default, interval pelaporan adalah 10 detik, tetapi Anda dapat mengubah interval pelaporan dengan FleetEngine.setLocationReportingInterval(long, TimeUnit). Interval update minimum yang didukung adalah 5 detik. Update yang lebih sering dapat menyebabkan permintaan dan error yang lebih lambat.

Menonaktifkan pembaruan lokasi

Saat shift pengemudi selesai, pembaruan lokasi dapat dihentikan dengan memanggil DeliveryVehicleReporter.disableLocationTracking.

Kasus penggunaan model tepercaya

Bagian ini menjelaskan cara menggunakan Driver SDK untuk mengimplementasikan kasus penggunaan umum saat menggunakan model tepercaya.

Buat kendaraan

Anda dapat membuat kendaraan dari Driver SDK.

Sebelum membuat kendaraan, pastikan untuk menginisialisasi Delivery Driver API. ID kendaraan harus dibuat dengan ID kendaraan dan penyedia yang digunakan selama inisialisasi Driver SDK. Kemudian buat kendaraan seperti yang ditunjukkan pada 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 pengiriman dari Driver SDK.

Sebelum membuat tugas, pastikan untuk menginisialisasi Delivery Driver API. Tugas harus dibuat menggunakan ID penyedia yang ditentukan selama inisialisasi Driver SDK. Kemudian buat tugas pengambilan pengiriman seperti yang ditunjukkan pada contoh berikut. Untuk mengetahui 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 menginisialisasi Delivery Driver API. Kemudian buat tugas pengiriman seperti yang ditunjukkan pada contoh berikut. Untuk mengetahui 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 tidak tersedia (misalnya, untuk waktu istirahat bagi pengemudi atau mengisi bahan bakar) dari Driver SDK. Tugas ketidaktersediaan terjadwal tidak boleh menyertakan ID pelacakan. Anda dapat memberikan lokasi.

Sebelum membuat tugas, pastikan untuk menginisialisasi Delivery Driver API. Kemudian, buat tugas tidak tersedia seperti yang ditunjukkan dalam contoh berikut. Untuk mengetahui 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 penghentian terjadwal dari Driver SDK. Tugas penghentian terjadwal tidak boleh menyertakan ID pelacakan.

Sebelum membuat tugas, pastikan untuk menginisialisasi Delivery Driver API. Kemudian buat tugas perhentian terjadwal seperti yang ditunjukkan dalam contoh berikut. Untuk mengetahui 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.
}

Memperbarui pengurutan tugas

Anda dapat memperbarui urutan eksekusi tugas yang ditetapkan ke kendaraan dari Driver SDK.

Memperbarui pengurutan tugas juga akan menetapkan tugas ke kendaraan jika belum ditetapkan sebelumnya ke kendaraan. Fungsi ini juga menutup tugas yang sebelumnya ditetapkan ke kendaraan dan tidak dicantumkan dalam pemesanan yang diperbarui. Menetapkan tugas ke kendaraan yang berbeda jika sebelumnya telah ditugaskan ke kendaraan lain akan menyebabkan error. Sebelum menetapkan tugas ke kendaraan baru, tutup tugas yang ada, lalu buat tugas baru.

Anda dapat memperbarui pengurutan tugas kapan saja.

Sebelum memperbarui urutan tugas untuk kendaraan, pastikan kendaraan dan tugas telah 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.
}

Pengecualian mungkin terjadi yang dapat mencegah update pada status internal Driver SDK. Jika hal ini terjadi, selesaikan masalah, lalu panggil setVehicleStops lagi sampai panggilan berhasil.

Potensi masalah dapat mencakup:

  • VehicleStop yang ditentukan tidak mengikuti pola yang valid. Hanya VehicleStop pertama yang boleh ada di VehicleStopStates: NEW, ENROUTE, atau ARRIVED. VehicleStop setelah perhentian saat ini harus berada dalam VehicleStopState BARU.

  • Tugas tidak ada, atau milik kendaraan lain.

  • Kendaraan tidak ada.

Kendaraan sedang dalam perjalanan ke perhentian berikutnya

Fleet Engine harus diberi tahu saat kendaraan berangkat dari perhentian, dan saat memulai navigasi. Anda dapat memberi tahu Fleet Engine dari Driver SDK.

Sebelum memberi tahu Fleet Engine bahwa kendaraan berangkat dari perhentian, pastikan kendaraan berhenti telah dibuat dan ditetapkan. Kemudian beri tahu Fleet Engine tentang keberangkatan kendaraan seperti yang ditunjukkan pada 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.
}

Pengecualian mungkin terjadi yang dapat mencegah update pada status internal Driver SDK. Jika hal ini terjadi, selesaikan masalah, lalu panggil enrouteToNextStop lagi hingga berhasil.

Potensi masalah dapat mencakup:

  • Tidak ada VehicleStops lagi 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 penghentian kendaraan telah ditetapkan. Kemudian, beri tahu Fleet Engine tentang kedatangan kendaraan di perhentian seperti yang ditunjukkan pada 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.
}

Pengecualian dapat terjadi yang dapat mencegah update pada status internal Driver SDK. Jika ini terjadi, selesaikan masalah, lalu panggil arrivedAtStop lagi sampai berhasil.

Potensi masalah dapat mencakup:

  • Tidak ada VehicleStops lagi yang ditetapkan di Driver SDK.

Kendaraan menyelesaikan perhentian

Fleet Engine harus diberi tahu saat kendaraan menyelesaikan perhentian. Hal ini menyebabkan semua tugas yang terkait dengan perhentian ditetapkan ke status TERTUTUP. Anda dapat memberi tahu Fleet Engine dari Driver SDK.

Beri tahu Fleet Engine bahwa kendaraan telah menyelesaikan VehicleStop-nya seperti yang ditunjukkan pada 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.
}

Pengecualian dapat terjadi yang dapat mencegah update pada status internal Driver SDK. Jika ini terjadi, selesaikan masalah, lalu panggil completedStop lagi sampai berhasil.

Potensi masalah dapat mencakup:

  • Tidak ada VehicleStops lagi yang ditetapkan di Driver SDK.

Menutup tugas

Untuk menutup tugas yang telah ditetapkan ke kendaraan, beri tahu Fleet Engine bahwa kendaraan telah menyelesaikan perhentian tempat tugas berlangsung, atau menghapusnya dari daftar perhentian kendaraan. Untuk melakukannya, Anda dapat menetapkan daftar pemberhentian kendaraan yang tersisa sama seperti saat memperbarui urutan tugas untuk kendaraan.

Jika kendaraan belum ditetapkan untuk tugas, dan kendaraan harus ditutup, perbarui tugas ke status DITUTUP. Namun, Anda tidak dapat membuka kembali tugas DITUTUP.

Menutup tugas tidak menunjukkan keberhasilan atau kegagalan. Ini menunjukkan bahwa tugas tersebut tidak lagi dianggap sedang berlangsung. Untuk pelacakan pengiriman, penting untuk menunjukkan hasil aktual dari tugas sehingga hasil pengiriman dapat ditampilkan.

Sebuah tugas harus ditetapkan 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 berlangsung.

Atau, perbarui urutan tugas kendaraan yang ditetapkan untuk tugas, lalu hapus tugas yang diinginkan dari daftar perhentian.

Menetapkan hasil tugas dan lokasi hasil

Menutup tugas tidak menunjukkan keberhasilan atau kegagalan. Ini menunjukkan bahwa tugas tersebut tidak lagi dianggap sedang berlangsung. Untuk pelacakan pengiriman, penting untuk menunjukkan hasil sebenarnya dari tugas agar hasil pengiriman dapat ditampilkan, sehingga ada penagihan yang tepat untuk layanan. Setelah ditetapkan, Anda tidak dapat mengubah hasil tugas. Tetapi Anda dapat mengubah waktu hasil tugas dan lokasi hasil tugas setelah Anda menetapkannya.

Tugas yang berada dalam status TERTUTUP dapat memiliki hasilnya yang ditetapkan ke BERHASIL atau GAGAL. Fleet Engine hanya menagih tugas pengiriman dengan status BERHASIL.

Saat menandai hasil tugas, Fleet Engine akan otomatis mengisi lokasi hasil tugas dengan lokasi kendaraan terakhir yang diketahui. Anda dapat mengganti perilaku ini dengan memanggil Fleet Engine. Perhatikan bahwa Anda tidak dapat menetapkan lokasi hasil tugas menggunakan Driver SDK.

Contoh kode berikut menunjukkan cara menggunakan Driver SDK untuk menetapkan hasil dan stempel waktu tugas.

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 kendaraan, pastikan Anda menginisialisasi 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.