عند تتبُّع مشوار، يعرض تطبيق المستهلك موقع المركبة المناسبة للمستهلك. لإجراء ذلك، يحتاج تطبيقك إلى بدء تتبُّع رحلة وتعديل تقدّم الرحلة وإيقاف تتبُّعها عند اكتمالها.
تتناول هذه المستندات كيفية عمل هذه العملية.
قبل البدء
تأكَّد من إعداد ما يلي:
خدمات الخلفية لتطبيق المستهلك جاهزة وتعمل خدمات مطابقة المستهلكين بالمركبات.
لقد أعددت خريطة لتطبيقك.
بدء تتبُّع رحلة
عندما يطابق خادم الخلفية مستهلكًا بمركبة، استخدِم JourneySharingSession لبدء تتبُّع المشوار.
تعرض عينة الرمز البرمجي التالية كيفية بدء تتبُّع مشوار بعد تحميل طريقة العرض.
جافا
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()
}
}
تعديل تقدُّم الرحلة
لتعديل تفاصيل تقدُّم الرحلة، مثل المسافة التي يجب أن تقطعها المركبة قبل الوصول والوقت المقدَّر للوصول، يحتاج تطبيقك إلى تسجيل متتبِّع وضبطه كما هو موضّح في الأمثلة التالية.
سجِّل مستمعًا على عنصر
TripModel.جافا
// 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.جافا
// 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 لإيقاف تتبُّع المشوار كما هو موضّح في عينة الرمز البرمجي التالية.
جافا
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 | متوسط عائد النقرة | الوصف |
|---|---|---|
| 400 | INVALID_ARGUMENT | حدّد العميل اسم مشوار غير صالح. يجب أن يتّبع اسم المشوار التنسيق providers/{provider_id}/trips/{trip_id}. يجب أن يكون
provider_id هو رقم تعريف مشروع Cloud الذي يملكه
مقدّم الخدمة. |
| 401 | عدم الحصول على المصادقة | يظهر هذا الخطأ إذا لم تكن هناك بيانات اعتماد مصادقة صالحة. على سبيل المثال، إذا تم توقيع رمز JWT المميّز بدون رقم تعريف مشوار أو إذا انتهت صلاحية رمز JWT المميّز. |
| 403 | PERMISSION_DENIED | يظهر هذا الخطأ إذا لم يكن لدى العميل إذن كافٍ (على سبيل المثال، إذا حاول مستخدم لديه دور المستهلك استدعاء updateTrip)، أو إذا كان رمز JWT المميّز غير صالح، أو إذا لم تكن واجهة برمجة التطبيقات مفعّلة لمشروع العميل. قد يكون رمز JWT المميّز غير متوفّر أو تم توقيعه باستخدام رقم تعريف مشوار لا يتطابق مع رقم تعريف المشوار المطلوب. |
| 429 | RESOURCE_EXHAUSTED | حصة الموارد تساوي صفرًا أو يتجاوز معدّل الزيارات الحدّ الأقصى المسموح به. |
| 503 | UNAVAILABLE | الخدمة غير متاحة. عادةً ما يكون الخادم معطّلاً. |
| 504 | DEADLINE_EXCEEDED | انتهت المهلة النهائية لتقديم الطلب. لا يظهر هذا الخطأ إلا إذا ضبط المتصل مهلة أقصر من المهلة التلقائية للطريقة (أي أنّ المهلة المطلوبة غير كافية للخادم لمعالجة الطلب) ولم يكتمل الطلب خلال المهلة. |
التعامل مع أخطاء حزمة تطوير برامج المستهلك (Consumer SDK)
ترسل حزمة تطوير برامج المستهلك (Consumer SDK) أخطاء تعديل المشوار إلى تطبيق المستهلك باستخدام آلية معاودة الاتصال. إنّ مَعلمة معاودة الاتصال هي نوع القيمة التي تم إرجاعها الخاص بالنظام الأساسي ( TripUpdateError على Android و NSError على iOS).
استخراج رموز الحالة
عادةً ما تكون الأخطاء التي يتم تمريرها إلى معاودة الاتصال هي أخطاء gRPC، ويمكنك أيضًا استخراج معلومات إضافية منها في شكل رمز حالة. للاطّلاع على القائمة الكاملة برموز الحالة، يُرجى الرجوع إلى رموز الحالة واستخدامها في gRPC.
جافا
يمكنك استخراج رمز حالة 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()
}
تفسير رموز الحالة
تغطّي رموز الحالة نوعَين من الأخطاء: الأخطاء المتعلّقة بالخادم والشبكة، والأخطاء من جهة العميل.
أخطاء الخادم والشبكة
رموز الحالة التالية مخصّصة لأخطاء الشبكة أو الخادم، ولا تحتاج إلى اتّخاذ أي إجراء لحلّها. تستردّ حزمة تطوير برامج المستهلك (Consumer SDK) تلقائيًا من هذه الأخطاء.
| رمز الحالة | الوصف |
|---|---|
| ABORTED | توقّف الخادم عن إرسال الاستجابة. عادةً ما يكون ذلك بسبب مشكلة في الخادم. |
| CANCELLED | أنهى الخادم الاستجابة الصادرة. يحدث ذلك عادةً عندما
يتم إرسال التطبيق إلى الخلفية أو عند حدوث تغيير في الحالة في
تطبيق المستهلك. |
| INTERRUPTED | |
| DEADLINE_EXCEEDED | استغرق الخادم وقتًا طويلاً للاستجابة. |
| UNAVAILABLE | الخادم غير متوفّر. عادةً ما يكون ذلك بسبب مشكلة في الشبكة |
أخطاء العميل
رموز الحالة التالية مخصّصة لأخطاء العميل، ويجب اتّخاذ إجراء لحلّها. تواصل حزمة تطوير برامج المستهلك (Consumer SDK) إعادة محاولة تعديل المشوار إلى أن توقف مشاركة الرحلة، ولكن لن يتم استرداد المشوار إلا بعد اتّخاذ إجراء.
| رمز الحالة | الوصف |
|---|---|
| INVALID_ARGUMENT | حدّد تطبيق المستهلك اسم مشوار غير صالح. يجب أن يتّبع اسم المشوار التنسيق providers/{provider_id}/trips/{trip_id}.
|
| NOT_FOUND | لم يتم إنشاء المشوار مطلقًا. |
| PERMISSION_DENIED | لا يملك تطبيق المستهلك أذونات كافية. يحدث هذا الخطأ في الحالات التالية:
|
| RESOURCE_EXHAUSTED | حصة الموارد تساوي صفرًا أو يتجاوز معدّل تدفق الزيارات الحدّ الأقصى المسموح به. |
| UNAUTHENTICATED | تعذّرت مصادقة الطلب بسبب رمز JWT المميّز غير الصالح. يحدث هذا الخطأ إما عند توقيع رمز JWT المميّز بدون رقم تعريف مشوار أو عند انتهاء صلاحية رمز JWT المميّز. |