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 অনুরোধের সময়সীমা পেরিয়ে গেছে। এই সমস্যা তখনই হয় যখন কলার এমন একটি সময়সীমা সেট করেন যা পদ্ধতির ডিফল্ট সময়সীমার থেকে কম (অর্থাৎ, অনুরোধ প্রসেস করার জন্য সার্ভারের কাছে পর্যাপ্ত সময় নেই) এবং অনুরোধটি সময়সীমার মধ্যে সম্পূর্ণ হয়নি।

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

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

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

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

Java

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

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

Kotlin

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

// 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 টোকেনের মেয়াদ শেষ হয়ে যায়।