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 RPC বিবরণ
400 INVALID_ARGUMENT ক্লায়েন্ট ভুল ট্রিপের নাম উল্লেখ করেছে। ট্রিপের নাম অবশ্যই providers/{provider_id}/trips/{trip_id} ফর্ম্যাট অনুসরণ করতে হবে। provider_id অবশ্যই পরিষেবা প্রদানকারীর মালিকানাধীন ক্লাউড প্রোজেক্টের আইডি হতে হবে।
401 যাচাই করা হয়নি এমন ইমেল সঠিক যাচাইকরণ সংক্রান্ত ক্রেডেনশিয়াল না থাকলে আপনি এই সমস্যা দেখতে পাবেন। যেমন, ট্রিপ আইডি ছাড়া JWT টোকেন সাইন করা হলে অথবা JWT টোকেনের মেয়াদ শেষ হয়ে গেলে।
403 PERMISSION_DENIED ক্লায়েন্টের কাছে পর্যাপ্ত অনুমতি না থাকলে (যেমন, কনজিউমার রোলের কোনও ব্যবহারকারী updateTrip কল করার চেষ্টা করলে), JWT টোকেন ভুল হলে অথবা ক্লায়েন্ট প্রোজেক্টের জন্য API চালু করা না থাকলে আপনি এই সমস্যার মেসেজ দেখতে পাবেন। JWT টোকেন হয়ত নেই অথবা টোকেনটি এমন একটি ট্রিপ আইডির সাথে সাইন করা আছে যা অনুরোধ করা ট্রিপ আইডির সাথে মেলে না।
429 RESOURCE_EXHAUSTED রিসোর্স কোটা শূন্যে পৌঁছে গেছে অথবা ট্রাফিকের হার সীমা ছাড়িয়ে গেছে।
503 উপলভ্য নেই পরিষেবা উপলভ্য নেই। সাধারণত সার্ভার ডাউন থাকলে এটি হয়।
504 DEADLINE_EXCEEDED অনুরোধের সময়সীমা পেরিয়ে গেছে। এই সমস্যা তখনই হয় যখন কলার এমন একটি সময়সীমা সেট করেন যা পদ্ধতির ডিফল্ট সময়সীমার চেয়ে কম (অর্থাৎ, অনুরোধ করা সময়সীমা সার্ভারের পক্ষে অনুরোধ প্রসেস করার জন্য যথেষ্ট নয়) এবং অনুরোধটি সময়সীমার মধ্যে শেষ হয়নি।

Consumer SDK সংক্রান্ত সমস্যার সমাধান করা

Consumer SDK, কলব্যাক মেকানিজম ব্যবহার করে কনজিউমার অ্যাপে ট্রিপ আপডেট সংক্রান্ত সমস্যার তথ্য পাঠায়। কলব্যাক প্যারামিটার হল প্ল্যাটফর্ম-নির্দিষ্ট রিটার্ন টাইপ (Android-এ TripUpdateError এবং iOS-এ NSError )।

স্ট্যাটাস কোড এক্সট্র্যাক্ট করুন

কলব্যাকে পাস করা সমস্যাগুলি সাধারণত gRPC সমস্যা এবং আপনি স্ট্যাটাস কোড হিসেবে সেগুলি থেকে অতিরিক্ত তথ্যও বের করতে পারবেন। স্ট্যাটাস কোডের সম্পূর্ণ তালিকার জন্য, স্ট্যাটাস কোড এবং gRPC-তে সেগুলির ব্যবহার দেখুন।

Java

আপনি gRPC স্ট্যাটাস কোড এক্সট্র্যাক্ট করতে পারবেন যা onTripUpdateError() থেকে ফেরত আসা TripUpdateError থেকে সমস্যার ব্যাপারে বিস্তারিত তথ্য প্রদান করে।

// Called when there is a trip update error.
@Override
public void onTripUpdateError(TripInfo tripInfo, TripUpdateError error) {
  Status.Code code = error.getStatusCode();
}

Kotlin

আপনি gRPC স্ট্যাটাস কোড এক্সট্র্যাক্ট করতে পারবেন যা onTripUpdateError() থেকে ফেরত আসা TripUpdateError থেকে সমস্যার ব্যাপারে বিস্তারিত তথ্য প্রদান করে।

// Called when there is a trip update error.
override fun onTripUpdateError(tripInfo: TripInfo, error: TripUpdateError) {
  val code = error.getStatusCode()
}

স্ট্যাটাস কোড ব্যাখ্যা করা

স্ট্যাটাস কোড দুই ধরনের সমস্যার ক্ষেত্রে ব্যবহার করা হয়: সার্ভার ও নেটওয়ার্ক-সম্পর্কিত সমস্যা এবং ক্লায়েন্ট-সাইড সমস্যা।

সার্ভার ও নেটওয়ার্ক সংক্রান্ত সমস্যা

নিম্নলিখিত স্ট্যাটাস কোডগুলি নেটওয়ার্ক বা সার্ভারের সমস্যার জন্য এবং সেগুলি সমাধান করার জন্য আপনাকে কোনও পদক্ষেপ নিতে হবে না। Consumer SDK অটোমেটিক এগুলি থেকে রিকভার করে।

স্ট্যাটাস কোডবিবরণ
বাতিল করা হয়েছে সার্ভার উত্তর পাঠানো বন্ধ করে দিয়েছে। সাধারণত সার্ভারে সমস্যা হলে এটি হয়।
বাতিল করা হয়েছে সার্ভার আউটগোয়িং রেসপন্স বন্ধ করে দিয়েছে। সাধারণত এটি ঘটে যখন
অ্যাপটি ব্যাকগ্রাউন্ডে পাঠানো হয়, অথবা যখন
কনজিউমার অ্যাপের স্ট্যাটাস পরিবর্তন হয়।
বাধাপ্রাপ্ত
DEADLINE_EXCEEDED সার্ভার উত্তর দিতে অনেক বেশি সময় নিয়েছে।
উপলভ্য নেই সার্ভার উপলভ্য ছিল না। সাধারণত নেটওয়ার্ক সংক্রান্ত সমস্যার কারণে এটি হয়।

ক্লায়েন্ট সংক্রান্ত সমস্যা

নিম্নলিখিত স্ট্যাটাস কোডগুলি ক্লায়েন্টের সমস্যার জন্য এবং সেগুলি সমাধান করার জন্য আপনাকে অবশ্যই ব্যবস্থা নিতে হবে। আপনি জার্নি শেয়ারিং বন্ধ না করা পর্যন্ত Consumer SDK ট্রিপ রিফ্রেশ করার চেষ্টা চালিয়ে যায়, তবে আপনি অ্যাকশন না নেওয়া পর্যন্ত এটি আগের অবস্থায় ফিরে আসবে না।

স্ট্যাটাস কোডবিবরণ
INVALID_ARGUMENT কনজিউমার অ্যাপে ভুল ট্রিপের নাম উল্লেখ করা হয়েছে; ট্রিপের নাম অবশ্যই providers/{provider_id}/trips/{trip_id} ফর্ম্যাট অনুযায়ী হতে হবে।
NOT_FOUND ট্রিপটি কখনও তৈরি করা হয়নি।
PERMISSION_DENIED Consumer অ্যাপের কাছে পর্যাপ্ত অনুমতি নেই। এই সমস্যাটি হয় যখন:
  • Consumer অ্যাপের কাছে অনুমতি নেই
  • Google Cloud Console-এ প্রোজেক্টের জন্য Consumer SDK চালু করা নেই।
  • JWT টোকেন হয় নেই অথবা ভুল।
  • JWT টোকেনটি এমন একটি ট্রিপ আইডি দিয়ে সাইন করা হয়েছে যা অনুরোধ করা ট্রিপের সাথে মেলেনি।
RESOURCE_EXHAUSTED রিসোর্স কোটা শূন্যে রয়েছে অথবা ট্রাফিক ফ্লোর রেট স্পিড লিমিট ছাড়িয়ে গেছে।
যাচাই করা হয়নি এমন ইমেল ভুল JWT টোকেনের কারণে অনুরোধের যাচাইকরণ করা যায়নি। এই সমস্যাটি হয় যখন JWT টোকেন ট্রিপ আইডি ছাড়াই সাইন করা হয় অথবা যখন JWT টোকেনের মেয়াদ শেষ হয়ে যায়।