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