เมื่อคุณติดตามการเดินทาง แอปสำหรับผู้บริโภคจะแสดงตำแหน่งของ ยานพาหนะที่เหมาะสมต่อผู้บริโภค โดยแอปจะต้องเริ่ม ติดตามการเดินทาง อัปเดตความคืบหน้าของการเดินทาง และหยุดติดตามการเดินทางเมื่อ การเดินทางเสร็จสมบูรณ์
เอกสารนี้จะอธิบายวิธีการทำงานของกระบวนการดังกล่าว
ก่อนเริ่มต้น
ตรวจสอบว่าคุณได้ตั้งค่าสิ่งต่อไปนี้แล้ว
- บริการแบ็กเอนด์สำหรับแอปที่มุ่งเน้นผู้บริโภคพร้อมใช้งานแล้ว และบริการ สำหรับการจับคู่ผู้บริโภคกับยานพาหนะก็พร้อมให้บริการแล้ว 
- คุณได้ตั้งค่าแผนที่สำหรับแอปแล้ว 
เริ่มติดตามการเดินทาง
เมื่อเซิร์ฟเวอร์แบ็กเอนด์จับคู่ผู้บริโภคกับยานพาหนะ ให้ใช้
JourneySharingSession เพื่อเริ่มติดตามการเดินทาง
โค้ดตัวอย่างต่อไปนี้แสดงวิธีเริ่มติดตามการเดินทางหลังจากโหลดมุมมองแล้ว
Java
public class MainActivity extends AppCompatActivity
    implements ConsumerViewModel.JourneySharingListener  {
  // Class implementation
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Create a TripModel instance to listen for updates to the trip specified by this trip name.
    String tripName = ...;
    TripModelManager tripModelManager = consumerApi.getTripModelManager();
    TripModel tripModel = tripModelManager.getTripModel(tripName);
    // Create a JourneySharingSession instance based on the TripModel.
    JourneySharingSession session = JourneySharingSession.createInstance(tripModel);
    // Add the JourneySharingSession instance on the map for updating the UI.
    consumerController.showSession(session);
    // Register for trip update events.
    tripModel.registerTripCallback(new TripModelCallback() {
      @Override
      public void onTripETAToNextWaypointUpdated(
          TripInfo tripInfo, @Nullable Long timestampMillis) {
        // ...
      }
      @Override
      public void onTripActiveRouteRemainingDistanceUpdated(
          TripInfo tripInfo, @Nullable Integer distanceMeters) {
        // ...
      }
      // ...
    });
  }
  @Override
  protected void onDestroy() {
    super.onDestroy();
    if (journeySharingSession != null) {
      journeySharingSession.stop();
    }
  }
}
Kotlin
class SampleAppActivity : AppCompatActivity(), ConsumerViewModel.JourneySharingListener {
  // Class implementation
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // Create a TripModel instance to listen for updates to the trip specified by this trip name.
    val tripName = "tripName"
    val tripModelManager = consumerApi.getTripModelManager()
    val tripModel = tripModelManager.getTripModel(tripName)
    // Create a JourneySharingSession instance based on the TripModel.
    val session = JourneySharingSession.createInstance(tripModel)
    // Add the JourneySharingSession instance on the map for updating the UI.
    consumerController.showSession(session)
    // Register for trip update events.
    tripModel.registerTripCallback(
      object : TripModelCallback() {
        override fun onTripETAToNextWaypointUpdated(
          tripInfo: TripInfo,
          timestampMillis: Long?,
        ) {
          // ...
        }
        override fun onTripActiveRouteRemainingDistanceUpdated(
          tripInfo: TripInfo,
          distanceMeters: Int?,
        ) {
          // ...
        }
      // ...
    })
  }
  override fun onDestroy() {
    super.onDestroy()
    journeySharingSession?.stop()
  }
}
อัปเดตความคืบหน้าของการเดินทาง
หากต้องการอัปเดตรายละเอียดความคืบหน้าของการเดินทาง เช่น ระยะทางที่ยานพาหนะต้อง เดินทางก่อนถึงที่หมายและเวลาที่คาดว่าจะถึง แอปของคุณต้อง ลงทะเบียนและกำหนดค่า Listener ตามที่แสดงในตัวอย่างต่อไปนี้
- ลงทะเบียน Listener ในออบเจ็กต์ - TripModel- Java- // Create a TripModel instance for listening to updates to the trip specified by this trip name. String tripName = ...; TripModelManager tripModelManager = consumerApi.getTripModelManager(); TripModel tripModel = tripModelManager.getTripModel(tripName); // Create a JourneySharingSession instance based on the TripModel. JourneySharingSession session = JourneySharingSession.createInstance(tripModel); // Add the JourneySharingSession instance on the map for updating the UI. consumerController.showSession(session); // Register for trip update events. tripModel.registerTripCallback(new TripModelCallback() { @Override public void onTripETAToNextWaypointUpdated( TripInfo tripInfo, @Nullable Long timestampMillis) { // ... } @Override public void onTripActiveRouteRemainingDistanceUpdated( TripInfo tripInfo, @Nullable Integer distanceMeters) { // ... } // ... });- Kotlin- // Create a TripModel instance for listening to updates to the trip specified by this trip name. val tripName = "tripName" val tripModelManager = consumerApi.getTripModelManager() val tripModel = tripModelManager.getTripModel(tripName) // Create a JourneySharingSession instance based on the TripModel. val session = JourneySharingSession.createInstance(tripModel) // Add the JourneySharingSession instance on the map for updating the UI. consumerController.showSession(session) // Register for trip update events. tripModel.registerTripCallback( object : TripModelCallback() { override fun onTripETAToNextWaypointUpdated( tripInfo: TripInfo, timestampMillis: Long?, ) { // ... } override fun onTripActiveRouteRemainingDistanceUpdated( tripInfo: TripInfo, distanceMeters: Int?, ) { // ... } // ... })
- กำหนดค่าผู้ฟังสำหรับการเดินทางโดยใช้ - TripModelOptions- Java- // Set refresh interval to 2 seconds. TripModelOptions tripOptions = TripModelOptions.builder().setRefreshIntervalMillis(2000).build(); tripModel.setTripModelOptions(tripOptions);- Kotlin- // Set refresh interval to 2 seconds. val tripOptions = TripModelOptions.builder().setRefreshIntervalMillis(2000).build() tripModel.setTripModelOptions(tripOptions)
หยุดติดตามการเดินทาง
ตรวจสอบว่าแอปหยุดติดตามการเดินทางเมื่อไม่จำเป็นแล้ว เช่น เมื่อคนขับทำเครื่องหมายการเดินทางว่า "เสร็จสมบูรณ์" ที่แบ็กเอนด์ การหยุดแชร์การเดินทางจะช่วยหลีกเลี่ยงคำขอเครือข่ายที่ไม่จำเป็นไปยัง Fleet Engine และป้องกันการรั่วไหลของหน่วยความจำ
ใช้ JourneySharingSession เพื่อหยุดติดตามการเดินทางตามที่แสดงใน
ตัวอย่างโค้ดต่อไปนี้
Java
public class MainActivity extends AppCompatActivity
    implements ConsumerViewModel.JourneySharingListener  {
  // Class implementation
  @Override
  protected void onDestroy() {
    super.onDestroy();
    if (journeySharingSession != null) {
      journeySharingSession.stop();
    }
  }
}
Kotlin
class SampleAppActivity : AppCompatActivity(), ConsumerViewModel.JourneySharingListener {
  // Class implementation
  override fun onDestroy() {
    super.onDestroy()
    journeySharingSession?.stop()
  }
}
จัดการข้อผิดพลาดในการเดินทาง
เมธอด onTripRefreshError จะแสดงข้อผิดพลาดที่เกิดขึ้นระหว่างการตรวจสอบการเดินทาง
 ข้อความแสดงข้อผิดพลาดเป็นไปตามมาตรฐานข้อผิดพลาดของ Google Cloud โปรดดูคำจำกัดความของข้อความแสดงข้อผิดพลาดและรหัสข้อผิดพลาดทั้งหมดโดยละเอียดในเอกสารประกอบเกี่ยวกับข้อผิดพลาดของ Google Cloud
ข้อผิดพลาดที่พบบ่อยซึ่งอาจเกิดขึ้นระหว่างการตรวจสอบการเดินทางมีดังนี้
| HTTP | RPC | คำอธิบาย | 
|---|---|---|
| 400 | INVALID_ARGUMENT | ไคลเอ็นต์ระบุชื่อการเดินทางไม่ถูกต้อง ชื่อการเดินทางต้องเป็นไปตามรูปแบบ providers/{provider_id}/trips/{trip_id}provider_id ต้องเป็นรหัสของโปรเจ็กต์ระบบคลาวด์ที่เป็นของ
  ผู้ให้บริการ | 
| 401 | UNAUTHENTICATED | คุณจะได้รับข้อผิดพลาดนี้หากไม่มีข้อมูลเข้าสู่ระบบการตรวจสอบสิทธิ์ที่ถูกต้อง เช่น หากโทเค็น JWT ลงนามโดยไม่มีรหัสการเดินทางหรือโทเค็น JWT หมดอายุ | 
| 403 | PERMISSION_DENIED | คุณจะได้รับข้อผิดพลาดนี้หากไคลเอ็นต์มีสิทธิ์ไม่เพียงพอ (เช่น ผู้ใช้ที่มีบทบาทผู้บริโภคพยายามเรียกใช้ updateTrip) หากโทเค็น JWT ไม่ถูกต้อง หรือไม่ได้เปิดใช้ API สำหรับโปรเจ็กต์ไคลเอ็นต์ อาจไม่มีโทเค็น JWT หรือโทเค็นลงนามด้วยรหัสการเดินทางที่ไม่ตรงกับรหัสการเดินทางที่ขอ | 
| 429 | RESOURCE_EXHAUSTED | โควต้าทรัพยากรเป็น 0 หรืออัตราการเข้าชมเกินขีดจำกัด | 
| 503 | UNAVAILABLE | ไม่พร้อมให้บริการ โดยปกติแล้วเซิร์ฟเวอร์จะหยุดทำงาน | 
| 504 | DEADLINE_EXCEEDED | เกินกำหนดเวลาในการส่งคำขอแล้ว ข้อผิดพลาดนี้จะเกิดขึ้นก็ต่อเมื่อผู้โทรตั้งค่า กำหนดเวลาที่สั้นกว่ากำหนดเวลาเริ่มต้นของเมธอด (กล่าวคือ กำหนดเวลาที่ขอไม่เพียงพอให้เซิร์ฟเวอร์ประมวลผลคำขอ) และ คำขอไม่เสร็จสิ้นภายในกำหนดเวลา | 
จัดการข้อผิดพลาดของ Consumer SDK
SDK สำหรับผู้บริโภคจะส่งข้อผิดพลาดในการอัปเดตการเดินทางไปยังแอปสำหรับผู้บริโภคโดยใช้กลไกการเรียกกลับ
 พารามิเตอร์การเรียกกลับคือประเภทการคืนค่าเฉพาะแพลตฟอร์ม (
TripUpdateError
ใน Android และ
NSError
ใน iOS)
ดึงข้อมูลรหัสสถานะ
โดยปกติแล้ว ข้อผิดพลาดที่ส่งไปยังการเรียกกลับจะเป็นข้อผิดพลาดของ gRPC และคุณยังสามารถ ดึงข้อมูลเพิ่มเติมจากข้อผิดพลาดเหล่านั้นในรูปแบบรหัสสถานะได้ด้วย ดูรายการรหัสสถานะทั้งหมดได้ที่รหัสสถานะและการใช้งานใน gRPC
Java
คุณสามารถดึงรหัสสถานะ gRPC ที่ให้รายละเอียดเกี่ยวกับข้อผิดพลาด
จาก TripUpdateError ที่ส่งคืนจาก onTripUpdateError()
// Called when there is a trip update error.
@Override
public void onTripUpdateError(TripInfo tripInfo, TripUpdateError error) {
  Status.Code code = error.getStatusCode();
}
Kotlin
คุณสามารถดึงรหัสสถานะ gRPC ที่ให้รายละเอียดเกี่ยวกับข้อผิดพลาด
จาก TripUpdateError ที่ส่งคืนจาก onTripUpdateError()
// Called when there is a trip update error.
override fun onTripUpdateError(tripInfo: TripInfo, error: TripUpdateError) {
  val code = error.getStatusCode()
}
ทำความเข้าใจรหัสสถานะ
รหัสสถานะครอบคลุมข้อผิดพลาด 2 ประเภท ได้แก่ ข้อผิดพลาดเกี่ยวกับเซิร์ฟเวอร์และเครือข่าย และข้อผิดพลาดฝั่งไคลเอ็นต์
ข้อผิดพลาดเกี่ยวกับเซิร์ฟเวอร์และเครือข่าย
รหัสสถานะต่อไปนี้ใช้สำหรับข้อผิดพลาดเกี่ยวกับเครือข่ายหรือเซิร์ฟเวอร์ และคุณไม่จำเป็นต้องดำเนินการใดๆ เพื่อแก้ไข Consumer SDK จะกู้คืนจากข้อผิดพลาดเหล่านี้โดยอัตโนมัติ
| รหัสสถานะ | คำอธิบาย | 
|---|---|
| ถูกยกเลิก | เซิร์ฟเวอร์หยุดส่งการตอบกลับ โดยปกติแล้ว ปัญหานี้เกิดจาก ปัญหาเกี่ยวกับเซิร์ฟเวอร์ | 
| ยกเลิกแล้ว | เซิร์ฟเวอร์สิ้นสุดการตอบกลับขาออก โดยปกติแล้ว
      เหตุการณ์นี้จะเกิดขึ้นเมื่อ แอปถูกส่งไปทำงานเบื้องหลัง หรือเมื่อมีการเปลี่ยนแปลงสถานะใน แอปสำหรับผู้บริโภค | 
| ถูกขัดจังหวะ | |
| DEADLINE_EXCEEDED | เซิร์ฟเวอร์ใช้เวลาตอบสนองนานเกินไป | 
| UNAVAILABLE | เซิร์ฟเวอร์ไม่พร้อมใช้งาน โดยปกติแล้ว ปัญหานี้เกิดจากปัญหาเกี่ยวกับเครือข่าย | 
ข้อผิดพลาดของไคลเอ็นต์
รหัสสถานะต่อไปนี้เป็นข้อผิดพลาดของไคลเอ็นต์ และคุณต้องดำเนินการเพื่อ แก้ไข SDK สำหรับผู้บริโภคจะลองรีเฟรชการเดินทางต่อไปจนกว่าคุณจะ สิ้นสุดการแชร์การเดินทาง แต่จะไม่กู้คืนจนกว่าคุณจะดำเนินการ
| รหัสสถานะ | คำอธิบาย | 
|---|---|
| INVALID_ARGUMENT | แอปสำหรับผู้บริโภคระบุชื่อการเดินทางที่ไม่ถูกต้อง ชื่อการเดินทางต้องเป็นไปตามรูปแบบ providers/{provider_id}/trips/{trip_id} | 
| NOT_FOUND | ไม่มีการสร้างการเดินทาง | 
| PERMISSION_DENIED | แอปสำหรับผู้บริโภคมีสิทธิ์ไม่เพียงพอ ข้อผิดพลาดนี้จะเกิดขึ้นเมื่อ 
 | 
| RESOURCE_EXHAUSTED | โควต้าทรัพยากรเป็น 0 หรืออัตราการไหลของการเข้าชมเกิน ขีดจำกัดความเร็ว | 
| UNAUTHENTICATED | คำขอตรวจสอบสิทธิ์ไม่สำเร็จเนื่องจากโทเค็น JWT ไม่ถูกต้อง ข้อผิดพลาดนี้ เกิดขึ้นเมื่อมีการลงนามโทเค็น JWT โดยไม่มีรหัสการเดินทาง หรือ เมื่อโทเค็น JWT หมดอายุ |