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

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

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

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

قبل البدء

تأكد من إعداد العناصر التالية:

  • تمّت إتاحة خدمات الخلفية لتطبيقك المخصّص للمستهلكين وأصبحت خدماتك لإقران المستهلكين بالمركبات تعمل.

  • إعداد خريطة لتطبيقك

بدء متابعة رحلة

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

تعديل مستوى تقدّم الرحلة

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

  1. تسجيل أداة استماع على كائن 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?,
        ) {
          // ...
        }
    
      // ...
    })
    
  2. ضبط خدمة المستمع لرحلتك باستخدام "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. للحصول على تفاصيل وتعريفات رسائل الخطأ وجميع رموز الأخطاء، يمكنك الرجوع إلى أخطاء 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 للمستهلك أخطاء تعديل الرحلة إلى تطبيق المستهلِك باستخدام آلية callback . مَعلمة callback هي نوع إرجاع خاص بنظام التشغيل ( 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()
}

تفسير رموز الحالة

تغطي رموز الحالة نوعين من الأخطاء: الأخطاء المتعلقة بالخادم والشبكة، و من جانب العميل.

أخطاء الخادم والشبكة

رموز الحالة التالية هي إما أخطاء في الشبكة أو الخادم، و ليس عليك اتّخاذ أي إجراء لحلّها. وتتم معالجة هذه الأخطاء تلقائيًا في حزمة Consumer SDK.

رمز الحالةالوصف
تم إلغاؤه توقّف الخادم عن إرسال الاستجابة. يحدث هذا عادةً بسبب مشكلة في الخادم.
تم إلغاؤها أنهى الخادم الاستجابة الصادرة. هذا طبيعي يحدث عندما
يتم إرسال التطبيق إلى الخلفية أو عندما يكون هناك تغيير في الحالة
تطبيق المستهلك.
INTERRUPTED
DEADLINE_EXCEEDED استغرق الخادم وقتًا طويلاً للاستجابة.
UNAVAILABLE الخادم غير متاح. تحدث هذه المشكلة عادةً بسبب مشكلة في الشبكة.

أخطاء العميل

رموز الحالة التالية هي لأخطاء جهة العميل، ويجب اتّخاذ إجراء لمعالجتها. يواصل حِزم SDK للمستهلكين إعادة المحاولة لإعادة تحميل الرحلة إلى أن تنتهي من مشاركة الرحلة، ولكن لن يتم استردادها إلى أن تتّخذ إجراءً.

رمز الحالةالوصف
INVALID_ARGUMENT استخدم تطبيق المستهلك اسم رحلة غير صالح. يجب أن يكون اسم الرحلة اتبع التنسيق providers/{provider_id}/trips/{trip_id}.
NOT_FOUND لم يتم إنشاء الرحلة مطلقًا.
PERMISSION_DENIED أذونات تطبيق المستهلك غير كافية. يحدث هذا الخطأ في الحالات التالية:
  • لا يملك تطبيق المستهلك أذونات
  • لم يتم تفعيل حزمة تطوير البرامج (SDK) الخاصة بالمستهلك للمشروع في Google Cloud. وحدة التحكم.
  • رمز JWT المميز إما مفقود أو غير صالح.
  • تم توقيع رمز JWT باستخدام معرّف رحلة لا يتطابق مع الرحلة المطلوبة.
RESOURCE_EXHAUSTED حصة الموارد تساوي صفرًا، أو معدل تدفق الزيارات يتجاوز الحد الأقصى للسرعة.
UNAUTHENTICATED تعذّرت مصادقة الطلب بسبب رمز JWT المميز غير الصالح. يحدث هذا الخطأ إما عند توقيع رمز JWT بدون رقم تعريف رحلة، أو عند انتهاء صلاحية رمز JWT.