การเริ่มต้นใช้งาน Driver SDK สําหรับ Android

ข้อกำหนดขั้นต่ำของระบบ

อุปกรณ์เคลื่อนที่ต้องใช้ Android 6.0 (API ระดับ 23) ขึ้นไป

การกำหนดค่าบิลด์และการอ้างอิง

Driver SDK เวอร์ชัน 4.99 ขึ้นไปมีให้ใช้งานในที่เก็บ Google Maven

Gradle

เพิ่มโค้ดต่อไปนี้ในไฟล์ build.gradle

repositories {
    ...
    google()
}

Maven

เพิ่มโค้ดต่อไปนี้ในไฟล์ pom.xml

<project>
  ...
  <repositories>
    <repository>
      <id>google-maven-repository</id>
      <url>https://maven.google.com</url>
    </repository>
  </repositories>
  ...
</project>

การกำหนดค่าโปรเจ็กต์

หากต้องการใช้ Driver SDK แอปของคุณต้องกำหนดเป้าหมายเป็น minSdkVersion 23 ขึ้นไป ดูข้อมูลเพิ่มเติมได้ที่บันทึกประจำรุ่น

หากต้องการเรียกใช้แอปที่สร้างด้วย Driver SDK อุปกรณ์ Android จะต้องติดตั้งบริการ Google Play ไว้

ตั้งค่าโปรเจ็กต์การพัฒนา

วิธีตั้งค่าโปรเจ็กต์การพัฒนาและรับคีย์ API สำหรับโปรเจ็กต์ใน Google Cloud Console มีดังนี้

  1. สร้างโปรเจ็กต์คอนโซล Google Cloud ใหม่หรือเลือกโปรเจ็กต์ที่มีอยู่เพื่อใช้กับ SDK ของไดรเวอร์ โปรดรอสักครู่จนกว่าโปรเจ็กต์ใหม่จะปรากฏใน Google Cloud Console

  2. หากต้องการเรียกใช้แอปเดโม โปรเจ็กต์ต้องมีสิทธิ์เข้าถึง Maps SDK สำหรับ Android ใน Google Cloud Console ให้เลือก API และบริการ > ไลบรารี จากนั้นค้นหาและเปิดใช้ Maps SDK สำหรับ Android

  3. รับคีย์ API สำหรับโปรเจ็กต์โดยเลือก API และบริการ > ข้อมูลเข้าสู่ระบบ > สร้างข้อมูลเข้าสู่ระบบ > คีย์ API ดูข้อมูลเพิ่มเติมเกี่ยวกับการรับคีย์ API ได้ที่รับคีย์ API

เพิ่ม SDK ไดรเวอร์ลงในแอป

Driver SDK มีให้ใช้งานในที่เก็บ Google Maven ที่เก็บประกอบด้วยไฟล์ Project Object Model (.pom) และ Javadocs ของ SDK วิธีเพิ่ม Driver SDK ในแอป

  1. เพิ่มทรัพยากร Dependency ต่อไปนี้ไปยังการกำหนดค่า Gradle หรือ Maven ของคุณ แล้วแทนที่ตัวยึดตำแหน่ง VERSION_NUMBER สำหรับ SDK ไดรเวอร์เวอร์ชันที่เลือก

    Gradle

    เพิ่มรายการต่อไปนี้ลงใน build.gradle

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

    Maven

    เพิ่มรายการต่อไปนี้ลงใน pom.xml

    <dependencies>
      ...
      <dependency>
        <groupId>com.google.android.libraries.mapsplatform.transportation.driver</groupId>
        <artifactId>transportation-driver</artifactId>
        <version>[VERSION_NUMBER]</version>
      </dependency>
    </dependencies>
    
  2. Driver SDK จะขึ้นอยู่กับ Navigation SDK โดยทรัพยากร Dependency นี้จะได้รับการกำหนดค่าในลักษณะที่ว่าหากจำเป็นต้องใช้ Navigation SDK เวอร์ชันที่เฉพาะเจาะจง จะต้องมีการกำหนดเวอร์ชันนั้นๆ อย่างชัดเจนในไฟล์การกำหนดค่าบิลด์ดังตัวอย่างต่อไปนี้ การไม่บล็อกโค้ดดังกล่าวจะช่วยให้โปรเจ็กต์ดาวน์โหลด Navigation SDK เวอร์ชันล่าสุดภายในเวอร์ชันการเผยแพร่หลักได้เสมอ โปรดทราบว่าลักษณะการทํางานที่รวมกันของ Driver SDK และ Navigation SDK เวอร์ชันล่าสุดได้รับการทดสอบที่เคร่งครัดก่อนเปิดตัว

    จัดการการกำหนดค่าทรัพยากร Dependency ของการพัฒนาและสภาพแวดล้อมการเผยแพร่ตามความเหมาะสม

    Gradle

    เพิ่มรายการต่อไปนี้ลงใน build.gradle

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

    Maven

    เพิ่มรายการต่อไปนี้ลงใน pom.xml

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

เพิ่มคีย์ API ลงในแอป

เมื่อเพิ่ม Driver SDK ในแอปแล้ว ให้เพิ่มคีย์ API ลงในแอป คุณต้องใช้คีย์ API ของโปรเจ็กต์ที่ได้มาเมื่อตั้งค่าโปรเจ็กต์การพัฒนา

ส่วนนี้อธิบายวิธีจัดเก็บคีย์ API เพื่อให้แอปอ้างอิงคีย์ดังกล่าวได้อย่างปลอดภัยยิ่งขึ้น คุณไม่ควรตรวจสอบคีย์ API ในระบบควบคุมเวอร์ชัน ซึ่งควรเก็บไว้ในไฟล์ local.properties ซึ่งอยู่ในไดเรกทอรีรากของโปรเจ็กต์ ดูข้อมูลเพิ่มเติมเกี่ยวกับไฟล์ local.properties ได้ที่ไฟล์คุณสมบัติ Gradle

หากต้องการปรับปรุงงานนี้ ให้ใช้ปลั๊กอินข้อมูลลับ Gradle สำหรับ Android โปรดทำตามขั้นตอนนี้เพื่อติดตั้งปลั๊กอิน Secret Gradle และจัดเก็บคีย์ API อย่างปลอดภัย

  1. เปิดไฟล์ build.gradle ที่ระดับราก แล้วเพิ่มโค้ดต่อไปนี้ลงในองค์ประกอบ dependencies ภายใต้ buildscript

    ดึงดูด

    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")
        }
    }
    
  2. เปิดไฟล์ build.gradle ระดับแอป และเพิ่มโค้ดต่อไปนี้ลงในองค์ประกอบ plugins

    ดึงดูด

    id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
    

    Kotlin

    id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
    
  3. ซิงค์โปรเจ็กต์ด้วย Gradle

  4. เปิด local.properties ในไดเรกทอรีระดับโปรเจ็กต์ แล้วเพิ่มโค้ดต่อไปนี้ อย่าลืมแทนที่ YOUR_API_KEY ด้วยคีย์ API ของคุณ

    MAPS_API_KEY=YOUR_API_KEY
    
  5. ในไฟล์ AndroidManifest.xml ให้ไปที่ com.google.android.geo.API_KEY และอัปเดตแอตทริบิวต์ android:value ดังนี้

    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="${MAPS_API_KEY}" />
    

ตัวอย่างต่อไปนี้แสดงไฟล์ Manifest ที่สมบูรณ์สำหรับแอปตัวอย่าง

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

ใส่การระบุแหล่งที่มาที่จำเป็นลงในแอปของคุณ

หากใช้ Driver SDK ในแอป คุณต้องใส่ข้อความระบุแหล่งที่มาและใบอนุญาตโอเพนซอร์สเป็นส่วนหนึ่งของส่วนประกาศทางกฎหมายของแอป วิธีที่ดีที่สุดคือรวมการระบุแหล่งที่มาเป็นรายการในเมนูอิสระหรือเป็นส่วนหนึ่งของรายการในเมนูเกี่ยวกับ

ข้อมูลใบอนุญาตจะอยู่ในไฟล์ "Third_party_licenses.txt" ในไฟล์ AAR ที่ยกเลิกการเก็บ

ดูวิธีใส่ประกาศโอเพนซอร์สได้ที่ https://developers.google.com/android/guides/opensource

การอ้างอิง

Driver SDK ใช้ gRPC เพื่อสื่อสารกับเซิร์ฟเวอร์ Fleet Engine หากยังไม่ได้นำเข้า gRPC คุณอาจต้องประกาศทรัพยากร Dependency ต่อไปนี้

dependencies {
    implementation 'io.grpc:grpc-android:1.12.0'
    implementation 'io.grpc:grpc-okhttp:1.12.0'
}

หากไม่มีทรัพยากร Dependency ดังกล่าว Driver SDK อาจพบข้อผิดพลาดขณะรันไทม์ขณะพยายามสื่อสารกับเซิร์ฟเวอร์ Fleet Engine

หากคุณใช้ ProGuard เพื่อเพิ่มประสิทธิภาพบิลด์ คุณอาจต้องเพิ่มบรรทัดต่อไปนี้ลงในไฟล์การกำหนดค่า ProGuard

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

ระดับ API ขั้นต่ำที่รองรับคือ 23

เริ่มต้น SDK

คุณต้องมีรหัสผู้ให้บริการ (โดยทั่วไปคือรหัสโปรเจ็กต์ Google Cloud) เพื่อเริ่มต้นออบเจ็กต์ DriverContext ดูรายละเอียดเพิ่มเติมเกี่ยวกับการตั้งค่าโปรเจ็กต์ Google Cloud ได้ที่การตรวจสอบสิทธิ์และการให้สิทธิ์

ก่อนที่จะใช้ Driver SDK คุณต้องเริ่มต้น Navigation SDK ก่อน วิธีเริ่มต้น SDK

  1. รับออบเจ็กต์ Navigator จาก 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. สร้างออบเจ็กต์ DriverContext เพื่อกรอกข้อมูลในช่องที่ต้องกรอก

    DriverContext driverContext = DriverContext.builder(application)
        .setProviderId(providerId)
        .setVehicleId(vehicleId)
        .setAuthTokenFactory(authTokenFactory)
        .setNavigator(navigator)
        .setRoadSnappedLocationProvider(
            NavigationApi.getRoadSnappedLocationProvider(application))
        .build();
    
  3. ใช้ออบเจ็กต์ DriverContext เพื่อเริ่มต้น *DriverApi

    DeliveryDriverApi driverApi = DeliveryDriverApi.createInstance(driverContext);
    
  4. รับ DeliveryVehicleReporter จากออบเจ็กต์ API (DeliveryVehicleReporter ขยายระยะเวลา NavigationVehicleReporter)

    DeliveryVehicleReporter vehicleReporter = driverApi.getDeliveryVehicleReporter();
    

กำลังตรวจสอบสิทธิ์กับ AuthTokenFactory

เมื่อ Driver SDK สร้างการอัปเดตตำแหน่ง ก็จะต้องส่งการอัปเดตเหล่านี้ไปยังเซิร์ฟเวอร์ Fleet Engine หากต้องการตรวจสอบสิทธิ์คำขอเหล่านี้ SDK ไดรเวอร์จะเรียกใช้อินสแตนซ์ AuthTokenFactory ที่ได้จากผู้โทร โรงงานมีหน้าที่สร้างโทเค็นการตรวจสอบสิทธิ์ ณ เวลาอัปเดตตำแหน่ง

วิธีสร้างโทเค็นมีความเฉพาะเจาะจงกับสถานการณ์ของนักพัฒนาซอฟต์แวร์แต่ละราย อย่างไรก็ตาม การใช้งานอาจจำเป็นต้อง

  • ดึงข้อมูลโทเค็นการตรวจสอบสิทธิ์ ซึ่งอาจอยู่ในรูปแบบ JSON จากเซิร์ฟเวอร์ HTTPS
  • แยกวิเคราะห์และแคชโทเค็น
  • โปรดรีเฟรชโทเค็นเมื่อหมดอายุ

โปรดดูรายละเอียดของโทเค็นที่เซิร์ฟเวอร์ Fleet Engine คาดหวังที่หัวข้อการสร้างโทเค็นเว็บ JSON (JWT) สำหรับการให้สิทธิ์

การจัดโครงสร้างของ AuthTokenFactory มีดังนี้

class JsonAuthTokenFactory implements AuthTokenFactory {
  private String vehicleServiceToken;  // initially null
  private 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 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;
    } 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);
    }
  }
}

การใช้งานเฉพาะนี้ใช้ไคลเอ็นต์ Java HTTP ในตัวเพื่อดึงข้อมูลโทเค็นในรูปแบบ JSON จากเซิร์ฟเวอร์การตรวจสอบสิทธิ์ของนักพัฒนาซอฟต์แวร์ ระบบจะบันทึกโทเค็น ไว้ใช้ซ้ำ ระบบจะดึงข้อมูลโทเค็นอีกครั้งหากโทเค็นเดิมอยู่ภายในช่วง 10 นาทีก่อนหมดอายุ

การติดตั้งใช้งานอาจดำเนินการต่างออกไป เช่น การใช้ชุดข้อความในเบื้องหลังเพื่อรีเฟรชโทเค็น

ข้อยกเว้นใน AuthTokenFactory จะถือว่าเป็นชั่วคราว เว้นแต่จะเกิดขึ้นซ้ำๆ หลังจากพยายามหลายครั้งแล้ว Driver SDK จะสันนิษฐานว่าข้อผิดพลาดนั้นเป็นข้อผิดพลาดถาวรและจะหยุดพยายามส่งการอัปเดต

การรายงานสถานะและข้อผิดพลาดเกี่ยวกับ StatusListener

เนื่องจาก Driver SDK จะดำเนินการต่างๆ ในเบื้องหลัง ให้ใช้ StatusListener เพื่อทริกเกอร์การแจ้งเตือนเมื่อเกิดเหตุการณ์บางอย่าง เช่น ข้อผิดพลาด คำเตือน หรือข้อความแก้ไขข้อบกพร่อง ข้อผิดพลาดอาจเกิดขึ้นชั่วคราว (เช่น BACKEND_CONNECTIVITY_ERROR) หรืออาจทำให้การอัปเดตตำแหน่งหยุดลงอย่างถาวร (เช่น VEHICLE_NOT_FOUND ซึ่งบ่งชี้ถึงข้อผิดพลาดในการกำหนดค่า)

คุณระบุการติดตั้งใช้งาน 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.
  }
}

หมายเหตุเกี่ยวกับ SSL/TLS

ภายใน การใช้งาน Driver SDK จะใช้ SSL/TLS เพื่อสื่อสารกับเซิร์ฟเวอร์ Fleet Engine อย่างปลอดภัย เวอร์ชันก่อนหน้าของ Android (API เวอร์ชัน 23 หรือเก่ากว่า) อาจต้องใช้แพตช์ SecurityProvider เพื่อสื่อสารกับเซิร์ฟเวอร์ ดูข้อมูลเพิ่มเติมเกี่ยวกับการทำงานกับ SSL ใน Android ได้ที่ผู้ให้บริการ GMS ด้านความปลอดภัย บทความนี้ยังมีตัวอย่างโค้ดสำหรับการแพตช์ผู้ให้บริการรักษาความปลอดภัยด้วย

เปิดใช้การอัปเดตตำแหน่ง

เมื่อคุณมีอินสแตนซ์ *VehicleReporter แล้ว การเปิดใช้การอัปเดตตำแหน่งจะมีผลดังนี้

DeliveryVehicleReporter reporter = ...;

reporter.enableLocationTracking();

หากเป็นไปได้จะส่งการอัปเดตตำแหน่งเป็นระยะๆ การอัปเดตตำแหน่งแต่ละครั้งจะทำให้ทราบว่ารถออนไลน์อยู่

โดยค่าเริ่มต้น ช่วงเวลาการรายงานคือ 10 วินาที คุณเปลี่ยนช่วงเวลาการรายงานได้ด้วย reporter.setLocationReportingInterval(long, TimeUnit) ช่วงเวลาการอัปเดตขั้นต่ำที่รองรับคือ 5 วินาที การอัปเดตบ่อยขึ้นอาจส่งผลให้ คำขอทำงานช้าลงและมีข้อผิดพลาด

ปิดการอัปเดตตำแหน่ง

เมื่อเปลี่ยนกะคนขับเสร็จแล้ว คุณหยุดอัปเดตตำแหน่งได้โดยโทรไปที่ DeliveryVehicleReporter.disableLocationTracking

กรณีการใช้งานโมเดลที่เชื่อถือได้

หัวข้อนี้จะอธิบายวิธีใช้ Driver SDK เพื่อติดตั้งใช้งาน Use Case ทั่วไปเมื่อใช้โมเดลที่เชื่อถือได้

สร้างยานพาหนะ

คุณสร้างยานพาหนะได้จาก Driver SDK

ก่อนสร้างยานพาหนะ อย่าลืมเริ่มต้น Delivery Driver API คุณต้องสร้างรหัสรถยนต์ด้วยรหัสรถยนต์และรหัสผู้ให้บริการที่ใช้ในช่วงเริ่มต้นของ Driver SDK จากนั้นให้สร้างยานพาหนะตามที่แสดงในตัวอย่างต่อไปนี้

DeliveryDriverApi api = DeliveryDriverApi.getInstance();
DeliveryVehicleManager vehicleManager = api.getDeliveryVehicleManager();
try {
  DeliveryVehicle vehicle = vehicleManager.createVehicle().get();
  // Handle CreateVehicleRequest DeliveryVehicle response.
} catch (Exception e) {
  // Handle CreateVehicleRequest error.
}

สร้างงานรับพัสดุ

คุณสร้างงานรับพัสดุได้จาก Driver SDK

ก่อนสร้างงาน อย่าลืมเริ่มต้น Delivery Driver API โดยต้องสร้างงานโดยใช้รหัสผู้ให้บริการที่ระบุไว้ในระหว่างการเริ่มต้นสร้าง SDK ของไดรเวอร์ จากนั้นสร้างงานรับสินค้าตามที่แสดงในตัวอย่างต่อไปนี้ ดูข้อมูลเกี่ยวกับรหัสงานได้ที่ตัวอย่างรหัสงาน

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

สร้างงานการนำส่งการจัดส่ง

คุณสร้างงานนำส่งพัสดุได้จาก Driver SDK

ก่อนสร้างงาน อย่าลืมเริ่มต้น Delivery Driver API จากนั้นสร้างงานการนำส่งสินค้าดังที่แสดงในตัวอย่างต่อไปนี้ ดูข้อมูลเกี่ยวกับรหัสงานได้ในตัวอย่างรหัสงาน

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

ความไม่พร้อมใช้งานตามกำหนดเวลา

คุณสร้างงานที่ระบุว่าไม่พร้อมใช้งาน (เช่น รถเสียหรือเติมน้ำมันรถ) ได้จาก Driver SDK งานที่ไม่พร้อมให้บริการที่ตั้งเวลาไว้ต้องไม่มีรหัสติดตาม โดยคุณจะระบุสถานที่ตั้งหรือไม่ก็ได้

ก่อนสร้างงาน อย่าลืมเริ่มต้น Delivery Driver API จากนั้นสร้างงานความพร้อมจำหน่ายสินค้าดังที่แสดงในตัวอย่างต่อไปนี้ ดูข้อมูลเกี่ยวกับรหัสงานได้ในตัวอย่างรหัสงาน

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

ป้ายจอดรถตามกำหนดการ

คุณจะสร้างงานหยุดที่กำหนดเวลาไว้จาก Driver SDK ก็ได้ งานหยุดที่กำหนดเวลาไว้อาจไม่มีรหัสติดตาม

ก่อนสร้างงาน อย่าลืมเริ่มต้น Delivery Driver API จากนั้นสร้างงานหยุดที่กำหนดเวลาไว้ดังที่แสดงในตัวอย่างต่อไปนี้ ดูข้อมูลเกี่ยวกับรหัสงานได้ในตัวอย่างรหัสงาน

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

อัปเดตการเรียงลำดับงาน

คุณอัปเดตลำดับการดำเนินงานที่มอบหมายให้กับยานพาหนะได้จาก SDK ของไดรเวอร์

การอัปเดตการเรียงลำดับงานยังเป็นการมอบหมายงานให้กับยานพาหนะด้วย หากก่อนหน้านี้ยังไม่ได้กำหนดให้ยานพาหนะนั้น อีกทั้งปิดงานที่เคยมอบหมายให้กับยานพาหนะไว้ก่อนหน้านี้และยังไม่ได้อัปเดตลำดับงานที่อัปเดตใหม่ การมอบหมายงานให้กับรถคันอื่น หากก่อนหน้านี้มีการมอบหมายงานให้กับรถคันอื่นแล้วเกิดข้อผิดพลาด ก่อนมอบหมายงานให้กับพาหนะใหม่ ให้ปิดงานที่มีอยู่แล้วสร้างงานใหม่

คุณอัปเดตการเรียงลำดับงานได้ทุกเมื่อ

ก่อนอัปเดตการเรียงลำดับงานสำหรับยานพาหนะ โปรดตรวจสอบว่าได้สร้างยานพาหนะและงานใน Fleet Engine แล้ว จากนั้นอัปเดตการเรียงลำดับงาน สำหรับยานพาหนะตามที่แสดงในตัวอย่างต่อไปนี้

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

อาจมีข้อยกเว้นที่อาจทำให้อัปเดตสถานะภายในของ SDK ไดรเวอร์ไม่ได้ หากเกิดกรณีเช่นนี้ ให้แก้ไขปัญหาแล้วโทรติดต่อ setVehicleStops อีกครั้งจนกว่าการโทรจะสำเร็จ

ปัญหาที่อาจเกิดขึ้นมีดังนี้

  • CarStops ที่ระบุไม่เป็นไปตามรูปแบบที่ถูกต้อง เฉพาะ VehicleStop แรกเท่านั้นที่สามารถอยู่ในยานพาหนะหยุดสถานะ: NEW, ENROUTE หรือ ARRIVED การหยุดยานพาหนะหลังจากหยุดรถปัจจุบันต้องอยู่ในสถานะ NEW ModelStopState

  • ไม่มีงานหรืองานเป็นของรถคันอื่น

  • ไม่มียานพาหนะอยู่

รถกำลังอยู่ระหว่างทางไปยังป้ายถัดไป

Fleet Engine ต้องได้รับการแจ้งเตือนเมื่อยานพาหนะออกจากจุดแวะพักและเมื่อเริ่มการนำทาง คุณสามารถแจ้ง Fleet Engine จาก Driver SDK ได้

ก่อนที่จะแจ้ง Fleet Engine ว่ารถออกจากจุดแวะแล้ว โปรดตรวจสอบว่าได้สร้างและตั้งค่าจุดพักรถแล้ว จากนั้นแจ้งให้ Fleet Engine ทราบ เวลาออกเดินทางของยานพาหนะตามที่แสดงในตัวอย่างต่อไปนี้

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

อาจมีข้อยกเว้นที่อาจทําให้การอัปเดตสถานะภายในของ SDK ไดรเวอร์ไม่ได้ หากเกิดเหตุการณ์นี้ขึ้น ให้แก้ไขปัญหาแล้วโทรหา enrouteToNextStop อีกครั้งจนกว่าจะสำเร็จ

ปัญหาที่อาจเกิดขึ้นมีดังนี้

  • ไม่มีการตั้งค่า VehicleStops เหลืออยู่ใน SDK ของไดรเวอร์

ยานพาหนะมาถึงป้าย

ต้องแจ้งเตือน Fleet Engine เมื่อยานพาหนะมาถึงจุดแวะพัก คุณแจ้ง Fleet Engine ได้จาก Driver SDK

ก่อนแจ้งให้ Fleet Engine ทราบว่ายานพาหนะมาถึงจุดจอดแล้ว โปรดตรวจสอบว่าได้ตั้งค่าจุดพักรถแล้ว จากนั้นแจ้งให้ Fleet Engine ทราบเมื่อยานพาหนะมาถึง ที่ป้ายจอดรถ ดังที่ปรากฏในตัวอย่างต่อไปนี้

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

อาจมีข้อยกเว้นที่อาจทําให้การอัปเดตสถานะภายในของ SDK ไดรเวอร์ไม่ได้ หากเกิดเหตุการณ์นี้ขึ้น ให้แก้ไขปัญหาแล้วโทรหา arrivedAtStop อีกครั้งจนกว่าจะสำเร็จ

ปัญหาที่อาจเกิดขึ้นมีดังนี้

  • ไม่มีการตั้งค่า VehicleStops เหลืออยู่ใน SDK ของไดรเวอร์

พาหนะจอดสำเร็จ

คุณต้องแจ้ง Fleet Engine เมื่อรถจอดจนสิ้นสุด การแจ้งเตือนนี้จะทำให้งานทั้งหมดที่เชื่อมโยงกับจุดปิดมีสถานะ "ปิด" คุณแจ้ง Fleet Engine ได้จาก Driver SDK

แจ้ง Fleet Engine ว่ารถได้จอดยานพาหนะอย่างสมบูรณ์ตามที่แสดงในตัวอย่างต่อไปนี้

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

อาจมีข้อยกเว้นที่อาจทําให้การอัปเดตสถานะภายในของ SDK ไดรเวอร์ไม่ได้ หากเกิดเหตุการณ์นี้ขึ้น ให้แก้ไขปัญหาแล้วโทรหา completedStop อีกครั้งจนกว่าจะสำเร็จ

ปัญหาที่อาจเกิดขึ้นมีดังนี้

  • ไม่มีการตั้งค่า VehicleStops เหลืออยู่ใน SDK ของไดรเวอร์

ปิดงาน

หากต้องการปิดงานที่มอบหมายไปยังยานพาหนะ ให้แจ้ง Fleet Engine ว่ารถได้หยุดการหยุดทำงานของยานพาหนะเรียบร้อยแล้ว หรือนำงานออกจากรายการจุดแวะพัก คุณสามารถทำได้โดยกำหนดรายการจุดแวะพักที่เหลือของยานพาหนะเหมือนกับตอนที่อัปเดตการเรียงลำดับงานสำหรับยานพาหนะ

หากยังไม่ได้มอบหมายงานและจำเป็นต้องปิดงาน ให้อัปเดตงานเป็นสถานะ "ปิด" แต่จะเปิดงานที่ปิดไปแล้วอีกครั้งไม่ได้

การปิดงานไม่ได้ระบุว่าประสบความสำเร็จหรือล้มเหลว เพื่อบอกให้ทราบว่างานดังกล่าว ไม่ได้อยู่ระหว่างดำเนินการอีกต่อไป สำหรับการติดตามการจัดส่ง คุณจำเป็นต้องระบุผลลัพธ์จริงของงานเพื่อให้ระบบแสดงผลลัพธ์การนำส่งได้

ต้องมีการมอบหมายงานให้กับรถยนต์เพื่อให้สามารถใช้ Driver SDK เพื่อปิดงานได้ หากต้องการปิดงานที่มอบหมายให้กับยานพาหนะ โปรดแจ้งให้ Fleet Engine ทราบว่ายานพาหนะได้หยุดการหยุดทำงานแล้ว

อีกทางเลือกหนึ่งคืออัปเดตลำดับงานของยานพาหนะที่ได้รับมอบหมายงานนั้น แล้วนำงานออกจากรายการจุดแวะพัก

กำหนดผลลัพธ์ของงานและตำแหน่งผลลัพธ์

การปิดงานไม่ได้ระบุว่าประสบความสำเร็จหรือล้มเหลว เพื่อบอกให้ทราบว่างานดังกล่าว ไม่ได้อยู่ระหว่างดำเนินการอีกต่อไป สำหรับการติดตามการจัดส่ง คุณจำเป็นต้องระบุผลลัพธ์จริงของงานเพื่อให้ระบบแสดงผลลัพธ์การนำส่งและมีการเรียกเก็บเงินสำหรับบริการที่เหมาะสม เมื่อตั้งค่าแล้ว คุณจะไม่สามารถเปลี่ยนผลลัพธ์ของงานได้ แต่คุณสามารถแก้ไขเวลาของผลลัพธ์ของงานและตำแหน่งของงานหลังจากที่ตั้งเวลาแล้ว

งานที่อยู่ในสถานะ "ปิด" สามารถตั้งผลลัพธ์เป็น "SUCCEEDED" หรือ "ล้มเหลว" ได้ Fleet Engine จะเรียกเก็บเงินเฉพาะงานที่ส่งที่สถานะ SUCCEEDED

เมื่อทำเครื่องหมายผลลัพธ์ของงาน Fleet Engine จะใส่ตำแหน่งของยานพาหนะตำแหน่งสุดท้ายที่ทราบโดยอัตโนมัติ คุณลบล้างลักษณะการทำงานนี้ได้

ตัวอย่างต่อไปนี้แสดงวิธีใช้ SDK ของไดรเวอร์เพื่อกำหนดผลลัพธ์ของงานและการประทับเวลา คุณไม่สามารถกำหนดตำแหน่งผลลัพธ์ของงานโดยใช้ 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.
    }

ค้นหายานพาหนะ

คุณสามารถค้นหารถได้จาก Driver SDK ก่อนการค้นหารถ โปรดตรวจสอบว่าคุณได้เริ่มต้น Delivery Driver API แล้ว จากนั้นค้นหายานพาหนะดังที่แสดงในตัวอย่างต่อไปนี้

    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 จะค้นหา DeliveryVehicle ได้เฉพาะรหัสรถยนต์ที่ให้ไว้ระหว่างการเริ่มต้น Delivery Driver API