การเริ่มต้นใช้งาน 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 ใหม่ หรือเลือกโปรเจ็กต์ที่มีอยู่เพื่อใช้งาน ด้วย 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. 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 โปรดทำตามขั้นตอนนี้เพื่อติดตั้งปลั๊กอิน 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;
  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);
    }
  }
}

การใช้งานนี้ใช้ไคลเอ็นต์ 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 ต้องสร้างงานโดยใช้รหัสผู้ให้บริการที่ระบุในระหว่าง Driver 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.
    }

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

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

  • DeviceStops ที่ระบุไม่เป็นไปตามรูปแบบที่ถูกต้อง เฉพาะรายการแรก DeviceStop สามารถอยู่ใน PaymentStopState ใดก็ได้ ซึ่งได้แก่ 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.
    }

อาจมีข้อยกเว้นที่ทำให้ไม่สามารถอัปเดต 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.
}

อาจมีข้อยกเว้นที่ทำให้ไม่สามารถอัปเดต 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.
    }

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

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

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

ปิดงาน

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

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

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

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

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

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

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

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

เมื่อทำเครื่องหมายผลลัพธ์ของงาน 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