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)
    

किसी यात्रा को फ़ॉलो करना बंद करना

पक्का करें कि आपका ऐप्लिकेशन, किसी यात्रा को फ़ॉलो करना बंद कर दे. जैसे, जब ड्राइवर, बैकएंड पर यात्रा को COMPLETE के तौर पर मार्क करता है. यात्रा की जानकारी शेयर करने की सुविधा बंद करने से, 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, सेवा देने वाली कंपनी के मालिकाना हक वाले Cloud प्रोजेक्ट का आईडी होना चाहिए.
401 UNAUTHENTICATED अगर आपके पास पुष्टि करने के मान्य क्रेडेंशियल नहीं हैं, तो आपको यह गड़बड़ी दिखती है. उदाहरण के लिए, अगर 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 में स्टेटस कोड और उनका इस्तेमाल देखें.

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 टूल, इनसे अपने-आप ठीक हो जाता है.

स्थिति कोडब्यौरा
ABORTED सर्वर ने जवाब भेजना बंद कर दिया. आम तौर पर, ऐसा सर्वर में कोई समस्या होने की वजह से होता है.
CANCELLED सर्वर ने आउटगोइंग जवाब को खत्म कर दिया. आम तौर पर, ऐसा तब होता है, जब ऐप्लिकेशन को बैकग्राउंड में भेजा जाता है या जब
कंज्यूमर ऐप्लिकेशन में कोई बदलाव होता है.
INTERRUPTED
DEADLINE_EXCEEDED सर्वर को जवाब देने में बहुत ज़्यादा समय लगा.
UNAVAILABLE सर्वर उपलब्ध नहीं था. आम तौर पर, ऐसा नेटवर्क में कोई समस्या होने की वजह से होता है.

क्लाइंट की गड़बड़ियां

यहां दिए गए स्टेटस कोड, क्लाइंट की गड़बड़ियों के लिए हैं. इन्हें ठीक करने के लिए, आपको कोई कार्रवाई करनी होगी. Consumer SDK टूल, यात्रा की जानकारी को रीफ़्रेश करने की कोशिश तब तक करता रहता है, जब तक यात्रा की जानकारी शेयर करने की सुविधा बंद नहीं की जाती. हालांकि, जब तक कोई कार्रवाई नहीं की जाती, तब तक यह ठीक नहीं होगा.

स्थिति कोडब्यौरा
INVALID_ARGUMENT कंज्यूमर ऐप्लिकेशन ने यात्रा का अमान्य नाम डाला है. यात्रा का नाम, providers/{provider_id}/trips/{trip_id} फ़ॉर्मैट में होना चाहिए.
NOT_FOUND यात्रा कभी बनाई ही नहीं गई.
PERMISSION_DENIED कंज्यूमर ऐप्लिकेशन के पास ज़रूरी अनुमतियां नहीं हैं. यह गड़बड़ी तब होती है, जब:
  • कंज्यूमर ऐप्लिकेशन के पास अनुमतियां नहीं होती हैं
  • Google Cloud Console में, प्रोजेक्ट के लिए Consumer SDK टूल चालू नहीं होता.
  • JWT टोकन मौजूद नहीं होता या अमान्य होता है.
  • JWT टोकन पर उस यात्रा आईडी से हस्ताक्षर किया गया होता है जो अनुरोध की गई यात्रा से मेल नहीं खाता.
RESOURCE_EXHAUSTED संसाधन का कोटा खत्म हो गया है या ट्रैफ़िक की दर, स्पीड लिमिट से ज़्यादा है.
UNAUTHENTICATED अमान्य JWT टोकन की वजह से, अनुरोध की पुष्टि नहीं हो सकी. यह गड़बड़ी तब होती है, जब JWT टोकन पर यात्रा आईडी के बिना हस्ताक्षर किया गया हो या जब JWT टोकन की समयसीमा खत्म हो गई हो.