Mulai menggunakan Driver SDK untuk Android

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 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 lebih tinggi. Untuk selengkapnya informasi, lihat Catatan Rilis.

Untuk menjalankan aplikasi yang dibangun dengan Driver SDK, Android perangkat harus memiliki Layanan Google Play terinstal.

Menyiapkan project pengembangan

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

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

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

  3. 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:

  1. 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</groupId>
        <artifactId>transportation-driver</artifactId>
        <version>VERSION_NUMBER</version>
      </dependency>
    </dependencies>
    
  2. 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>
    

Mengupdate manifes aplikasi

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

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

Misalnya, ganti PASTE_YOUR_API_KEY_HERE dengan kunci API Anda dalam 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

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, {i>Driver SDK<i} akan 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 FleetEngine. Untuk detail selengkapnya tentang cara menyiapkan Project Cloud, lihat Autentikasi dan Otorisasi.

Sebelum menggunakan Driver SDK, Anda harus melakukan inisialisasi terlebih dahulu Navigation SDK. Untuk melakukan inisialisasi 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, dengan mengisi kolom yang 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 membuat pembaruan lokasi, sistem harus mengirimkan pembaruan tersebut ke server Google 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:

  • Ambil token autentikasi, kemungkinan dalam format JSON, dari server HTTPS.
  • Uraikan dan simpan token dalam cache.
  • Muat ulang token jika masa berlakunya sudah habis.

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

Berikut adalah implementasi kerangka dari 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 dengan aman dengan server Fleet Engine. Versi Android sebelumnya (versi API 23 atau lebih lama) mungkin memerlukan Patch SecurityProvider untuk berkomunikasi dengan server. Untuk informasi selengkapnya tentang bekerja dengan SSL di Android, lihat Mengupdate penyedia keamanan agar terlindung dari eksploitasi SSL. 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, tetapi Anda dapat mengubah interval pelaporan dengan FleetEngine.setLocationReportingInterval(long, TimeUnit). Minimum Interval update yang didukung adalah 5 detik. Pembaruan 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 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 tidak dapat 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 state. 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

Fleet Engine harus diberi tahu saat kendaraan berhenti. Ini menyebabkan semua tugas yang terkait dengan perhentian agar ditetapkan ke status TUTUP. Kamu bisa memberi tahu Armada 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 state. 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 yang diinginkan 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 akan otomatis mengisi tugas dengan lokasi kendaraan terakhir yang diketahui. Anda dapat menggantinya perilaku model 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 tugas hasil dan {i>stempel waktu<i}.

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.