متابعة رحلة على جهاز Android

اختيار النظام الأساسي: Android iOS JavaScript

عند تتبُّع مشوار، يعرض تطبيق المستهلك موقع المركبة المناسبة للمستهلك. لإجراء ذلك، يحتاج تطبيقك إلى بدء تتبُّع رحلة وتعديل تقدّم الرحلة وإيقاف تتبُّعها عند اكتمالها.

تتناول هذه المستندات كيفية عمل هذه العملية.

قبل البدء

تأكَّد من إعداد ما يلي:

  • خدمات الخلفية لتطبيق المستهلك جاهزة وتعمل خدمات مطابقة المستهلكين بالمركبات.

  • لقد أعددت خريطة لتطبيقك.

بدء تتبُّع رحلة

عندما يطابق خادم الخلفية مستهلكًا بمركبة، استخدِم 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()
  }
}

تعديل تقدُّم الرحلة

لتعديل تفاصيل تقدُّم الرحلة، مثل المسافة التي يجب أن تقطعها المركبة قبل الوصول والوقت المقدَّر للوصول، يحتاج تطبيقك إلى تسجيل متتبِّع وضبطه كما هو موضّح في الأمثلة التالية.

  1. سجِّل مستمعًا على عنصر 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?,
        ) {
          // ...
        }
    
      // ...
    })
    
  2. اضبط المستمع لمشوارك باستخدام 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 لا يملك تطبيق المستهلك أذونات كافية. يحدث هذا الخطأ في الحالات التالية:
  • لا يملك تطبيق المستهلك أذونات
  • حزمة تطوير برامج المستهلك (Consumer SDK) غير مفعّلة للمشروع في Google Cloud Console.
  • رمز JWT المميّز غير متوفّر أو غير صالح.
  • تم توقيع رمز JWT المميّز باستخدام رقم تعريف مشوار لا يتطابق مع الـ مشوار المطلوب.
RESOURCE_EXHAUSTED حصة الموارد تساوي صفرًا أو يتجاوز معدّل تدفق الزيارات الحدّ الأقصى المسموح به.
UNAUTHENTICATED تعذّرت مصادقة الطلب بسبب رمز JWT المميّز غير الصالح. يحدث هذا الخطأ إما عند توقيع رمز JWT المميّز بدون رقم تعريف مشوار أو عند انتهاء صلاحية رمز JWT المميّز.