การเริ่มต้นใช้งาน 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 Console หรือเลือกโปรเจ็กต์ที่มีอยู่เพื่อใช้กับ Driver SDK รอสักครู่จนกว่าโปรเจ็กต์ใหม่จะปรากฏใน Google Cloud Console

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

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

เพิ่ม Driver SDK ลงในแอปของคุณ

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

  1. เพิ่มทรัพยากร Dependency ต่อไปนี้ลงในการกำหนดค่า Gradle หรือ Maven โดยแทนที่ตัวยึดตำแหน่ง VERSION_NUMBER สำหรับ Driver 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. SDK ไดรเวอร์อาศัย SDK การนำทาง ทรัพยากรประเภทนี้ได้รับการกำหนดค่าในลักษณะที่ว่าหากต้องใช้ 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

ใช้ปลั๊กอิน Secrets Gradle สำหรับ Android เพื่อปรับปรุงการทำงานนี้ให้มีประสิทธิภาพยิ่งขึ้น โปรดทำตามขั้นตอนนี้เพื่อติดตั้งปลั๊กอิน Secrets 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 หากต้องการตรวจสอบสิทธิ์คำขอเหล่านี้ Driver SDK จะเรียกใช้อินสแตนซ์ที่ผู้โทรระบุเป็น AuthTokenFactory โรงงานมีหน้าที่สร้างโทเค็นการตรวจสอบสิทธิ์ ณ เวลาอัปเดตตำแหน่ง

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

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

โปรดดูรายละเอียดโทเค็นที่เซิร์ฟเวอร์ Fleet Engine คาดหวังได้ที่การสร้าง JSON Web Token (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 เพื่อนำกรณีการใช้งานทั่วไปไปใช้เมื่อใช้โมเดลที่เชื่อถือได้

สร้างพาหนะ

คุณสร้างยานพาหนะได้จาก 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.
    }

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

คุณจะอัปเดตลำดับของงานที่มอบหมายให้กับยานพาหนะได้จาก Driver 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.
    }

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

ปัญหาที่อาจเกิดขึ้นอาจรวมถึงสิ่งต่อไปนี้

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

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

  • ไม่มียานพาหนะดังกล่าว

รถกำลังอยู่ระหว่างจอดไปยังจุดหมายถัดไป

คุณต้องแจ้ง 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.
    }

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

ปัญหาที่อาจเกิดขึ้นอาจรวมถึงสิ่งต่อไปนี้

  • ไม่มีการตั้งค่า VehicleStops เหลืออยู่ใน Driver 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.
}

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

ปัญหาที่อาจเกิดขึ้นอาจรวมถึงสิ่งต่อไปนี้

  • ไม่มีการตั้งค่า VehicleStops เหลืออยู่ใน Driver 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.
    }

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

ปัญหาที่อาจเกิดขึ้นอาจรวมถึงสิ่งต่อไปนี้

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

ปิดงาน

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

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

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

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

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

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

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

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

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

ตัวอย่างต่อไปนี้แสดงวิธีใช้ Driver 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 เท่านั้น