دنبال کردن سفر در 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 Error پیروی می‌کنند. برای مشاهده تعاریف دقیق پیام‌های خطا و همه کدهای خطا، به سند خطاهای Google Cloud مراجعه کنید.

در اینجا برخی‌از خطاهای رایجی که ممکن است درطول پایش سفر رخ دهد آورده شده است:

HTTP فراخوانی رویه‌ای دوردست شرح
۴۰۰ INVALID_ARGUMENT نام سفر مشخص‌شده توسط مشتری نامعتبر است. نام سفر باید از قالب providers/{provider_id}/trips/{trip_id} پیروی کند. provider_id باید شناسه «پروژه ابری» متعلق به ارائه‌دهنده خدمات باشد.
401 اصالت‌سنجی‌نشده اگر اعتبارنامه اصالت‌سنجی معتبری وجود نداشته باشد، این خطا را دریافت می‌کنید. برای مثال، اگر کد JWT بدون شناسه سفر امضا شده باشد یا کد JWT منقضی شده باشد.
403 PERMISSION_DENIED اگر مشتری اجازه کافی نداشته باشد (برای مثال، کاربری با نقش مصرف‌کننده سعی کند updateTrip را فراخوانی کند)، اگر توکن JWT نامعتبر باشد، یا اگر API برای پروژه مشتری فعال نشده باشد، این خطا را دریافت می‌کنید. ممکن است کد JWT وجود نداشته باشد یا کد با شناسه سفری امضا شده باشد که با شناسه سفر درخواست‌شده مطابقت ندارد.
429 RESOURCE_EXHAUSTED سهمیه منبع صفر است یا نرخ ترافیک از حد مجاز فراتر رفته است.
۵۰۳ دردسترس نیست سرویس دردسترس نیست. معمولاً سرور ازکار افتاده است.
504 DEADLINE_EXCEEDED مهلت درخواست به‌پایان رسید. این خطا فقط زمانی رخ می‌دهد که تماس‌گیرنده مهلتی را تنظیم کند که کوتاه‌تر از مهلت پیش‌فرض روش باشد (یعنی مهلت درخواست‌شده برای پردازش درخواست توسط سرور کافی نباشد) و درخواست در مهلت مقرر تکمیل نشود.

رسیدگی به خطاهای کیت توسعه نرم‌افزار مصرف‌کننده

«کیت توسعه نرم‌افزار مصرف‌کننده» خطاهای به‌روزرسانی سفر را بااستفاده از سازوکار فراخوانی برگشتی به برنامه مصرف‌کننده ارسال می‌کند. پارامتر callback یک نوع پاسخ مختص پلاتفرم است ( 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()
}

تفسیر کدهای وضعیت

کدهای وضعیت دو نوع خطا را پوشش می‌دهند: خطاهای مربوط به سرور و شبکه، و خطاهای سمت کارخواه.

خطاهای سرور و شبکه

کدهای وضعیت زیر مربوط به خطاهای شبکه یا سرور هستند و برای حل آن‌ها نیازی به انجام هیچ اقدامی ندارید. «کیت توسعه نرم‌افزار مصرف‌کننده» به‌طور خودکار از آن‌ها بازیابی می‌شود.

کد وضعیتشرح
لغوشده سرور ارسال پاسخ را متوقف کرد. این مشکل معمولاً به‌دلیل مشکل سرور رخ می‌دهد.
لغو شد سرور پاسخ خروجی را خاتمه داد. این معمولاً زمانی اتفاق می‌افتد که
برنامه به پس‌زمینه ارسال می‌شود، یا زمانی که تغییری در وضعیت
برنامه «مصرف‌کننده» رخ می‌دهد.
قطع‌شده
DEADLINE_EXCEEDED پاسخ دادن سرور خیلی طول کشید.
دردسترس نیست سرور دردسترس نبود. این مشکل معمولاً به‌دلیل مشکل شبکه رخ می‌دهد.

خطاهای کارخواه

کدهای وضعیت زیر مربوط به خطاهای مشتری است و برای حل آن‌ها باید اقدام کنید. «کیت توسعه نرم‌افزار مصرف‌کننده» تا زمانی که هم‌رسانی سفر را پایان دهید، به تلاش مجدد برای بازآوری سفر ادامه می‌دهد، اما تا زمانی که اقدام نکنید، بازیابی نخواهد شد.

کد وضعیتشرح
INVALID_ARGUMENT برنامه «مصرف‌کننده» نام سفر نامعتبری را مشخص کرده است؛ نام سفر باید از قالب providers/{provider_id}/trips/{trip_id} پیروی کند.
NOT_FOUND سفر هرگز ایجاد نشده است.
PERMISSION_DENIED برنامه «مصرف‌کننده» اجازه‌های کافی ندارد. این خطا زمانی رخ می‌دهد که:
  • برنامه «مصرف‌کننده» اجازه ندارد
  • ‫Consumer SDK برای پروژه در «کنسول Google Cloud» فعال نشده است.
  • کد JWT وجود ندارد یا نامعتبر است.
  • توکن JWT با شناسه سفری امضا شده است که با سفر درخواست‌شده مطابقت ندارد.
RESOURCE_EXHAUSTED سهمیه منبع صفر است، یا نرخ جریان ترافیک از حد مجاز سرعت فراتر رفته است.
اصالت‌سنجی‌نشده اصالت‌سنجی درخواست به‌دلیل کد JWT نامعتبر ناموفق بود. این خطا زمانی رخ می‌دهد که توکن JWT بدون شناسه سفر امضا شده باشد، یا زمانی که توکن JWT منقضی شده باشد.