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