เมื่อคุณติดตามการเดินทาง แอปสำหรับผู้ใช้จะแสดงตำแหน่งของยานพาหนะที่เหมาะสมแก่ผู้ใช้ ในการดำเนินการนี้ แอปของคุณต้องเริ่มติดตามการเดินทาง อัปเดตความคืบหน้าของการเดินทาง และหยุดติดตามการเดินทางเมื่อการเดินทางเสร็จสมบูรณ์
เอกสารนี้จะอธิบายวิธีการทำงานของกระบวนการดังกล่าว
ก่อนเริ่มต้น
ตรวจสอบว่าคุณได้ตั้งค่าสิ่งต่อไปนี้แล้ว
บริการแบ็กเอนด์สำหรับแอปผู้บริโภคพร้อมใช้งาน และบริการจับคู่ผู้บริโภคกับยานพาหนะทำงานได้
คุณได้ตั้งค่าแผนที่สำหรับแอปแล้ว
เริ่มติดตามการเดินทาง
เมื่อเซิร์ฟเวอร์แบ็กเอนด์จับคู่ผู้ใช้กับยานพาหนะ ให้ใช้ 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 ในออบเจ็กต์
TripModelJava
// 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?, ) { // ... } // ... })กำหนดค่า Listener สำหรับการเดินทางโดยใช้
TripModelOptionsJava
// 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 ต้องเป็นรหัสของโปรเจ็กต์ Cloud ที่ผู้ให้บริการเป็นเจ้าของ
|
| 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 พารามิเตอร์การเรียกกลับเป็นประเภทการแสดงผลเฉพาะแพลตฟอร์ม (
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 จะกู้คืนจากข้อผิดพลาดเหล่านั้นโดยอัตโนมัติ
| รหัสสถานะ | คำอธิบาย |
|---|---|
| ABORTED | เซิร์ฟเวอร์หยุดส่งการตอบกลับ โดยปกติแล้วข้อผิดพลาดนี้เกิดจากปัญหาเกี่ยวกับเซิร์ฟเวอร์ |
| CANCELLED | เซิร์ฟเวอร์ยกเลิกการตอบกลับขาออก โดยปกติแล้วข้อผิดพลาดนี้จะเกิดขึ้นเมื่อ
ระบบส่งแอปไปทำงานในเบื้องหลัง หรือเมื่อมีการเปลี่ยนแปลงสถานะใน
แอปสำหรับผู้ใช้ |
| INTERRUPTED | |
| DEADLINE_EXCEEDED | เซิร์ฟเวอร์ใช้เวลาตอบสนองนานเกินไป |
| UNAVAILABLE | เซิร์ฟเวอร์ไม่พร้อมใช้งาน โดยปกติแล้วข้อผิดพลาดนี้เกิดจากปัญหาเกี่ยวกับเครือข่าย |
ข้อผิดพลาดของไคลเอ็นต์
รหัสสถานะต่อไปนี้ใช้สำหรับข้อผิดพลาดของไคลเอ็นต์ และคุณต้องดำเนินการเพื่อแก้ไขข้อผิดพลาดเหล่านั้น Consumer SDK จะลองรีเฟรชการเดินทางต่อไปจนกว่าคุณจะสิ้นสุดการแชร์การเดินทาง แต่จะไม่กู้คืนจนกว่าคุณจะดำเนินการ
| รหัสสถานะ | คำอธิบาย |
|---|---|
| INVALID_ARGUMENT | แอปผู้บริโภคระบุชื่อการเดินทางไม่ถูกต้อง ชื่อการเดินทางต้อง
เป็นไปตามรูปแบบ providers/{provider_id}/trips/{trip_id}
|
| NOT_FOUND | ไม่เคยมีการสร้างการเดินทาง |
| PERMISSION_DENIED | แอปสำหรับผู้ใช้มีสิทธิ์ไม่เพียงพอ ข้อผิดพลาดนี้เกิดขึ้นในกรณีต่อไปนี้
|
| RESOURCE_EXHAUSTED | โควต้าทรัพยากรเป็น 0 หรืออัตราการเข้าชมเกิน ขีดจำกัดความเร็ว |
| UNAUTHENTICATED | คำขอไม่ผ่านการตรวจสอบสิทธิ์เนื่องจากโทเค็น JWT ไม่ถูกต้อง ข้อผิดพลาดนี้เกิดขึ้นเมื่อมีการลงชื่อโทเค็น JWT โดยไม่มีรหัสการเดินทาง หรือเมื่อโทเค็น JWT หมดอายุแล้ว |