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