ติดตามการเดินทางใน Android

เลือกแพลตฟอร์ม: Android iOS JavaScript

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

เอกสารนี้จะอธิบายวิธีการทำงานของกระบวนการดังกล่าว

ก่อนเริ่มต้น

ตรวจสอบว่าคุณได้ตั้งค่าสิ่งต่อไปนี้แล้ว

  • บริการแบ็กเอนด์สำหรับแอปผู้บริโภคพร้อมใช้งานแล้ว และบริการสำหรับการจับคู่ผู้บริโภคกับยานพาหนะก็พร้อมใช้งานแล้วเช่นกัน

  • คุณได้ตั้งค่าแผนที่สำหรับแอปแล้ว

เริ่มติดตามการเดินทาง

เมื่อเซิร์ฟเวอร์แบ็กเอนด์จับคู่ผู้บริโภคกับยานพาหนะ ให้ใช้ 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 ดังที่แสดงในตัวอย่างต่อไปนี้

  1. ลงทะเบียน 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?,
        ) {
          // ...
        }
    
      // ...
    })
    
  2. กำหนดค่า Listener สำหรับการเดินทางโดยใช้ 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

Consumer SDK จะส่งข้อผิดพลาดในการอัปเดตการเดินทางไปยังแอปผู้บริโภคโดยใช้กลไก Callback พารามิเตอร์ Callback เป็นประเภทการแสดงผลเฉพาะแพลตฟอร์ม (TripUpdateError ใน Android และ NSError ใน iOS)

ดึงข้อมูลรหัสสถานะ

ข้อผิดพลาดที่ส่งไปยัง Callback มักจะเป็นข้อผิดพลาด 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 เซิร์ฟเวอร์ไม่พร้อมใช้งาน ซึ่งโดยปกติแล้วจะเกิดจากปัญหาเกี่ยวกับเครือข่าย

ข้อผิดพลาดของไคลเอ็นต์

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

รหัสสถานะคำอธิบาย
INVALID_ARGUMENT แอปผู้บริโภคระบุชื่อการเดินทางที่ไม่ถูกต้อง ชื่อการเดินทางต้องเป็นไปตามรูปแบบ providers/{provider_id}/trips/{trip_id}
NOT_FOUND ไม่มีการสร้างการเดินทาง
PERMISSION_DENIED แอปผู้บริโภคมีสิทธิ์ไม่เพียงพอ ข้อผิดพลาดนี้จะเกิดขึ้นในกรณีต่อไปนี้
  • แอปผู้บริโภคไม่มีสิทธิ์
  • ไม่ได้เปิดใช้ Consumer SDK สำหรับโปรเจ็กต์ในคอนโซล Google Cloud
  • ไม่มีโทเค็น JWT หรือโทเค็นไม่ถูกต้อง
  • โทเค็น JWT มีการลงชื่อด้วยรหัสการเดินทางที่ไม่ตรงกับการเดินทางที่ขอ
RESOURCE_EXHAUSTED โควต้าทรัพยากรเป็น 0 หรืออัตราการไหลของการเข้าชมเกินขีดจำกัดความเร็ว
UNAUTHENTICATED คำขอดังกล่าวตรวจสอบสิทธิ์ไม่สำเร็จเนื่องจากโทเค็น JWT ไม่ถูกต้อง ข้อผิดพลาดนี้เกิดขึ้นเมื่อมีการลงชื่อโทเค็น JWT โดยไม่มีรหัสการเดินทาง หรือเมื่อโทเค็น JWT หมดอายุ