Google Maps Platform नेविगेशन SDK टूल की मदद से, एक Android नेविगेशन ऐप्लिकेशन बनाएं

1. शुरू करने से पहले

इस कोडलैब में, आपको एक ऐसा आसान Android ऐप्लिकेशन बनाने का तरीका बताया गया है जो पहले से कॉन्फ़िगर किए गए डेस्टिनेशन पर जाने के लिए, Google Maps Platform Navigation SDK टूल का इस्तेमाल करता है.

प्रोसेस पूरी होने के बाद, आपका ऐप्लिकेशन कुछ ऐसा दिखेगा.

b6c535afde7abd20.png

ज़रूरी शर्तें

  • Kotlin में Android ऐप्लिकेशन को बेहतर बनाने की बुनियादी जानकारी
  • Google Maps SDK टूल के बुनियादी सिद्धांतों, जैसे कि मैप, जगह की जानकारी, और निर्देशांक के बारे में जानकारी.

आपको इनके बारे में जानकारी मिलेगी

  • किसी डेस्टिनेशन पर जाने के लिए, Navigation SDK का इस्तेमाल करने वाला आसान Android ऐप्लिकेशन बनाने का तरीका.
  • रिमोट Google Maven रिपॉज़िटरी से नेविगेशन SDK टूल को इंटिग्रेट करने का तरीका
  • नेविगेशन SDK टूल के असली उपयोगकर्ता की शर्तों के साथ, जगह की जानकारी की अनुमतियों और उपयोगकर्ता के कानूनी समझौते को मैनेज करने का तरीका
  • SDK टूल शुरू करने का तरीका
  • मंज़िल सेट करने और नेविगेशन के लिए दिशा-निर्देश शुरू करने का तरीका.

आपको इन चीज़ों की ज़रूरत होगी

  • Android Studio का सबसे नया वर्शन इंस्टॉल होना चाहिए. यह कोडलैब Android Studio जैलीफ़िश का इस्तेमाल करके बनाया गया था. अगर किसी दूसरे वर्शन का इस्तेमाल किया जा रहा है, तो इंटरफ़ेस और कॉम्पोनेंट का लुक और लेआउट अलग हो सकता है.
  • बिलिंग की सुविधा वाला Google खाता और प्रोजेक्ट.
  • डेवलपर मोड में काम करने वाला Android डिवाइस, जिसमें यूएसबी डीबगिंग की सुविधा चालू हो या Android एमुलेटर. आपने जो भी विकल्प चुना हो, वह नेविगेशन SDK टूल के लिए तय की गई ज़रूरी शर्तों को पूरा करना चाहिए

2. सेट अप करें

अगर आपके पास पहले से कोई Google Cloud Platform खाता और बिलिंग वाला कोई प्रोजेक्ट नहीं है, तो Google Maps Platform का इस्तेमाल शुरू करने के निर्देशों https://developers.google.com/maps/gmp-get-started का पालन करके अपना Google Cloud प्रोजेक्ट सेट अप करें

कंसोल में अपना Google Cloud प्रोजेक्ट चुनें

Cloud Console में, प्रोजेक्ट के ड्रॉप-डाउन मेन्यू पर क्लिक करें और वह प्रोजेक्ट चुनें जिसका इस्तेमाल आपको इस कोडलैब के लिए करना है.

Google Cloud Console में, प्रोजेक्ट चुनने के लिए ड्रॉप-डाउन मेन्यू.

अपने प्रोजेक्ट में नेविगेशन SDK टूल चालू करना

इस कोडलैब के लिए ज़रूरी Google Maps Platform API और SDK को Google Cloud Marketplace में जाकर चालू करें.

Google Cloud Console में, एपीआई और सेवाएं > लाइब्रेरी पर जाएं और "Navigation SDK" खोजें.

आपको एक खोज नतीजा दिखेगा.

Google Cloud Console में एपीआई लाइब्रेरी की स्क्रीन, जिस पर नेविगेशन SDK टूल पेज दिख रहा है.

प्रॉडक्ट की जानकारी वाला पेज खोलने के लिए, नेविगेशन SDK टूल के नतीजे पर क्लिक करें. अपने प्रोजेक्ट पर SDK चालू करने के लिए, 'चालू करें' बटन पर क्लिक करें.

Android के लिए Google Maps SDK टूल के लिए भी यही प्रोसेस दोहराएं.

एपीआई पासकोड बनाना

Cloud Console के क्रेडेंशियल पेज पर जाकर, एक एपीआई पासकोड जनरेट करें. Google Maps Platform का इस्तेमाल शुरू करना में, तुरंत शुरू करने के सेक्शन के तीसरे चरण में दिया गया तरीका अपनाएं. Google Maps Platform का इस्तेमाल करने के लिए, एपीआई पासकोड ज़रूरी है.

3. प्रोजेक्ट की सैंपल फ़ाइलें पाना

इस सेक्शन में, इस कोडलैब के लिए GitHub के डेटा स्टोर करने की जगह से फ़ाइलों को क्लोन करके, खाली Android Studio प्रोजेक्ट सेट अप करने का तरीका बताया गया है. GitHub रेपो में, कोडलैब कोड के पहले और बाद के वर्शन शामिल हैं. कोडलैब एक खाली प्रोजेक्ट टेंप्लेट से शुरू होगा और काम पूरा होने के बाद तैयार होगा. अगर आपको कोई समस्या आती है, तो रेपो में मौजूद पूरे हो चुके प्रोजेक्ट का रेफ़रंस लें.

इस कोडलैब का कोड पाने के लिए, इस GitHub repo को क्लोन करें.

git clone https://github.com/googlemaps-samples/codelab-navigation-101-android-kotlin.git

अगर आपने git इंस्टॉल नहीं किया है, तो कोड पाने के लिए इस बटन पर क्लिक करें:

जल्द से जल्द शुरू करने के लिए, रेपो में Starter फ़ोल्डर में कुछ स्टार्टर कोड शामिल होते हैं. इससे आपको कोडलैब के इस मॉड्यूल के साथ-साथ आगे बढ़ने में मदद मिलती है. स्टार्टर प्रोजेक्ट में, ऐप्लिकेशन का बुनियादी यूज़र इंटरफ़ेस (यूआई) और बिल्ड कॉन्फ़िगरेशन मिलता है. हालांकि, इसमें नेविगेशन SDK टूल नहीं जोड़ा गया है. अगर आपको आगे बढ़ना है या अपनी प्रोग्रेस देखनी है, तो Solution प्रोजेक्ट भी उपलब्ध है.

Android Studio में क्लोन किया गया डेटा स्टोर करने की जगह खोलें

स्थानीय तौर पर रेपो की कॉपी बनाने के बाद, Starter फ़ोल्डर को मौजूदा प्रोजेक्ट के तौर पर खोलने के लिए Android Studio का इस्तेमाल करें.

  1. 'Android Studio में आपका स्वागत है' डायलॉग में, 'खोलें' बटन पर क्लिक करें.
  2. उस फ़ोल्डर पर जाएं जहां आपने क्लोन किए गए रेपो को सेव किया है. इसके बाद, टॉप लेवल "codelab-navigation-101-android-kotlin" में Starter फ़ोल्डर चुनें फ़ोल्डर खोलें.
  3. देखें कि प्रोजेक्ट बनता है और चलता है.

वर्चुअल डिवाइस जोड़ना या हार्डवेयर डिवाइस कनेक्ट करना

किसी Android डिवाइस को अपने कंप्यूटर से कनेक्ट करने के लिए, हार्डवेयर डिवाइस पर ऐप्लिकेशन चलाने के तरीके के बारे में Android Studio के निर्देशों का पालन करें. इसके अलावा, Android वर्चुअल डिवाइस (AVD) मैनेजर का इस्तेमाल करके, वर्चुअल डिवाइस को कॉन्फ़िगर किया जा सकता है. कोई एमुलेटर चुनते समय, पक्का करें कि आपने ऐसी इमेज चुनी हो जिसमें Google API शामिल हों.

Android Studio में, 'रन मेन्यू' विकल्प या 'चलाएं' बटन वाले आइकॉन पर क्लिक करें. निर्देशों के मुताबिक कोई डिवाइस चुनें.

4. अपने ऐप्लिकेशन में Navigation SDK टूल जोड़ना

अपने प्रोजेक्ट में नेविगेशन SDK लाइब्रेरी और एपीआई पासकोड जोड़ें

अपने ऐप्लिकेशन में नेविगेशन SDK लाइब्रेरी जोड़ने के लिए, आपको अपने ऐप्लिकेशन-लेवल build.gradle.kts में बदलाव करना होगा, ताकि Google Maven रिपॉज़िटरी से नेविगेशन SDK टूल को फ़ेच किया जा सके और वर्शन नंबर कॉन्फ़िगर किया जा सके.

नेविगेशन SDK टूल का वर्शन नंबर स्टोर करने के लिए, अपने बिल्ड कॉन्फ़िगरेशन में एक वैरिएबल बनाएं.

अपने ऐप्लिकेशन लेवल build.gradle.kts में एक वैरिएबल सेट अप करके, उसमें अपने ऐप्लिकेशन में इस्तेमाल किए जाने वाले नेविगेशन SDK टूल के वर्शन की वैल्यू शामिल करें. इससे, आने वाले समय में आसानी से नए वर्शन पर जाया जा सकता है.

नए वर्शन के नंबर के लिए, नेविगेशन SDK टूल के प्रॉडक्ट की जानकारी देखें.

val navSdkVersion by extra("6.0.0")

फ़ाइल > प्रोजेक्ट का स्ट्रक्चर > वैरिएबल में जाकर, डायलॉग बॉक्स का इस्तेमाल करके भी इस और दूसरे वैरिएबल की वैल्यू में बदलाव किया जा सकता है:

668332736b67dc82.png

बिल्ड कॉन्फ़िगरेशन में डिपेंडेंसी जोड़ना

अब अपने ऐप्लिकेशन-लेवल पर डिपेंडेंसी ब्लॉक में यहां दी गई एपीआई डिपेंडेंसी जोड़ें build.gradle.kts.इस्तेमाल किए गए वर्शन की वैल्यू ${navSdkVersion} होगी, जिसे आपने अपने ऐप्लिकेशन-लेवल build.gradle.kts में अभी-अभी सेट किया है:

dependencies {

   // Include the Google Navigation SDK.
   api("com.google.android.libraries.navigation:navigation:${navSdkVersion}")

...

अपना एपीआई पासकोड जोड़ना

एपीआई पासकोड मैनेज करने के लिए, Secrets Gradle प्लग इन का इस्तेमाल करना

हमारा सुझाव है कि अपने ऐप्लिकेशन में एपीआई पासकोड को सुरक्षित तरीके से मैनेज करने के लिए, Secrets Gradle प्लग इन का इस्तेमाल करें. प्लगिन को आपकी टॉप लेवल build.gradle.kts फ़ाइल में डिपेंडेंसी के तौर पर, शुरुआती प्रोजेक्ट टेंप्लेट में जोड़ दिया गया है.

// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin") version "2.0.1" apply false
    //... other plugin definitions here
}

secrets.properties फ़ाइल को अपनी टॉप-लेवल डायरेक्ट्री में खोलें. इसके बाद, YOUR_API_KEY को अपनी एपीआई पासकोड से बदलें. अपनी कुंजी इस फ़ाइल में सेव करें, क्योंकि secrets.properties के लिए वर्शन कंट्रोल सिस्टम की जांच नहीं की जा रही है.

MAPS_API_KEY=YOUR_API_KEY

इस विषय के बारे में ज़्यादा जानने के लिए, नेविगेशन SDK के दस्तावेज़ में अपने ऐप्लिकेशन में एपीआई पासकोड जोड़ें लेख पढ़ें.

local.defaults.property के कॉन्टेंट की पुष्टि करें

खाली प्रोजेक्ट में, आपकी टॉप-लेवल डायरेक्ट्री में local.defaults.properties फ़ाइल भी होती है. यह फ़ाइल, secrets.properties फ़ाइल वाले फ़ोल्डर में होती है. इसे खोलें और नीचे दिया गया कोड देखें.

MAPS_API_KEY=DEFAULT_API_KEY

यह MAPS_API_KEY प्रॉपर्टी के लिए बैकअप वैल्यू देने के लिए मौजूद है. ऐसा तब किया जाता है, जब secrets.properties को प्रोजेक्ट में नहीं जोड़ा जाता, ताकि बिल्ड न रुकें. इस फ़ाइल में बदलाव करने की कोई ज़रूरत नहीं है. अगर MAPS_API_KEY की secrets.properties परिभाषा नहीं मिलती है, तो डिफ़ॉल्ट वैल्यू, एपीआई कुंजी की गड़बड़ी के साथ रनटाइम पर ऐप्लिकेशन को बंद कर देगी.

देखें कि Android मेनिफ़ेस्ट में, आपने जो एपीआई पासकोड दिया है उसका इस्तेमाल किया जा रहा है या नहीं

app/src/main/AndroidManifest.xml खोलें. आपको पता चलेगा कि ऐप्लिकेशन के लिए एपीआई पासकोड सेट करने के लिए, MAPS_API_KEY प्रॉपर्टी का इस्तेमाल किया जाता है:

<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="${MAPS_API_KEY}" />

ऐप्लिकेशन-लेवल की build.gradle.kts फ़ाइल खोलें और secrets प्रॉपर्टी ढूंढें.

प्लग इन की propertiesFileName सेटिंग को secrets.properties पर सेट किया जाना चाहिए और defaultPropertiesFileName को local.defaults.properties पर सेट किया जाना चाहिए.

secrets {
    // Optionally specify a different file name containing your secrets.
    // The plugin defaults to "local.properties"
    propertiesFileName = "secrets.properties"

    // A properties file containing default secret values. This file can be
    // checked in version control.
    defaultPropertiesFileName = "local.defaults.properties"
}

सभी फ़ाइलें सेव करें और अपने प्रोजेक्ट को Gradle के साथ सिंक करें.

5. ऐप्लिकेशन अनुमतियां कॉन्फ़िगर करें और बुनियादी यूज़र इंटरफ़ेस (यूआई) जोड़ें

जगह की सटीक जानकारी की अनुमति का अनुरोध करना

नेविगेशन SDK टूल काम करने के लिए, जीपीएस सिग्नल पर निर्भर करता है. इसलिए, आपके ऐप्लिकेशन को उपयोगकर्ता से जगह की सटीक जानकारी के डेटा का ऐक्सेस देने के लिए कहना होगा. AndroidManifest.xml में <manifest> एलिमेंट के चाइल्ड के तौर पर, जगह की सटीक जानकारी ऐक्सेस करने की अनुमति जोड़ें.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" >
   <uses-permission 
      android:name="android.permission.ACCESS_FINE_LOCATION"
   />
</manifest>

Android डेवलपर दस्तावेज़ के जगह की जानकारी की अनुमतियों का अनुरोध करें सेक्शन में, जगह की जानकारी से जुड़ी Android अनुमतियों के बारे में ज़्यादा पढ़ा जा सकता है.

Android 14 वाले डिवाइस पर अपने ऐप्लिकेशन को चलाने के लिए, फ़ोरग्राउंड सेवा की जगह की जानकारी की अनुमति का अनुरोध करें. इसके लिए, उसी जगह पर दिए गए uses-permission टैग को जोड़ें जहां जगह की सटीक जानकारी ऐक्सेस करने की अनुमति दी गई है:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />

बेसिक यूज़र इंटरफ़ेस (यूआई) के साथ लॉन्च की गतिविधि जोड़ना

जब आपका ऐप्लिकेशन चलेगा, तो उसे स्टार्ट अप के दौरान चलने वाले कोड की ज़रूरत होगी. इससे यह पता चलेगा कि उपयोगकर्ता ने जगह की जानकारी ऐक्सेस करने की अनुमति दी है या नहीं. साथ ही, हर संभावित स्थिति को मैनेज किया जा सकेगा. अगर अनुमति नहीं दी गई है, तो अनुमति का अनुरोध किया जा सकेगा. ऐसा करने के लिए, अपने ऐप्लिकेशन में एक बेसिक यूज़र इंटरफ़ेस जोड़ें. यह कोडलैब, उस यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल करता है जिसे Android Studio में बिना किसी व्यू के नई गतिविधि बनाते समय बनाया गया है. नेविगेशन यूज़र इंटरफ़ेस (यूआई) के लिए गतिविधि में कोड जोड़ने से पहले, आपको जगह की जानकारी की अनुमति की जांच करने के लिए, इसे अडैप्ट करना होगा.

कोड एडिटर में MainActivity.kt फ़ाइल खोलें और बेसिक यूज़र इंटरफ़ेस (यूआई) दिखाने वाले कोड की जांच करें.

रनटाइम के दौरान जगह की जानकारी ऐक्सेस करने की अनुमतियों का अनुरोध करना

नेविगेशन SDK टूल शुरू करने से पहले, आपके ऐप्लिकेशन को जगह की सटीक जानकारी ऐक्सेस करने का अनुरोध ट्रिगर करना होगा.

यह पक्का करने के लिए कि आपका ऐप्लिकेशन चालू होने पर ही जांच हो, अपनी ऐक्टिविटी के बदले गए onCreate() तरीके का इस्तेमाल करके, अपनी MainActivity क्लास में कुछ कोड जोड़ें.

यहां दिया गया कोड यह जांच करता है कि उपयोगकर्ता ने जगह की सटीक जानकारी की अनुमति दी है या नहीं. अगर ऐसा नहीं है, तो वह अनुमति का अनुरोध करता है. यह कोड अपने onCreate() तरीके में जोड़ें.

    val permissions =
      if (VERSION.SDK_INT >= VERSION_CODES.TIRAMISU) {
        arrayOf(permission.ACCESS_FINE_LOCATION, permission.POST_NOTIFICATIONS)
      } else {
        arrayOf(permission.ACCESS_FINE_LOCATION)
      }

    if (permissions.any { !checkPermissionGranted(it) }) {

      if (permissions.any { shouldShowRequestPermissionRationale(it) }) {
        // Display a dialogue explaining the required permissions.
      }

      val permissionsLauncher =
        registerForActivityResult(
          RequestMultiplePermissions(),
          { permissionResults ->
            if (permissionResults.getOrDefault(permission.ACCESS_FINE_LOCATION, false)) {
              onLocationPermissionGranted()
            } else {
              finish()
            }
          },
        )

      permissionsLauncher.launch(permissions)
    } else {
      android.os.Handler(Looper.getMainLooper()).postDelayed({ onLocationPermissionGranted() }, SPLASH_SCREEN_DELAY_MILLIS)
    }
  }

  private fun checkPermissionGranted(permissionToCheck: String): Boolean =
    ContextCompat.checkSelfPermission(this, permissionToCheck) == PackageManager.PERMISSION_GRANTED

अपनी MainActivity क्लास में एक नया फ़ंक्शन जोड़ें, जिसे onLocationPermissionGranted कहा जाता है. यह फ़ंक्शन, उपयोगकर्ता की जगह की जानकारी शेयर करने की अनुमति मिलने पर, नतीजे को मैनेज करेगा. अगले चरणों में, हम यहां एक नई नेविगेशन गतिविधि लॉन्च करने के लिए कोड जोड़ेंगे.

private fun onLocationPermissionGranted() {
   //code to initialize Navigation SDK will go here
}

अपना प्रोजेक्ट बनाएं. अगर आपको बिल्ड से जुड़ी कोई गड़बड़ी मिलती है, तो उसे ढूंढें और ठीक करें.

अपने प्रोजेक्ट को नए वर्चुअल डिवाइस पर चलाएं. ऐप्लिकेशन इंस्टॉल होने और शुरू होने पर, आपको अनुमति का अनुरोध करने वाला डायलॉग दिखेगा.

6. नेविगेशन यूज़र इंटरफ़ेस जोड़ना

नेविगेशन यूज़र इंटरफ़ेस (यूआई) जोड़ने के दो तरीके हैं: SupportNavigationFragment या NavigationView.

आसानी के लिए, कोडलैब में NavigationView का इस्तेमाल किया गया है.

लेआउट में बदलाव करना

नेविगेशन व्यू के लिए लेआउट जोड़ने के लिए, res/layout/activity_main.xml में बदलाव करें.

  1. फ़ाइल खोलें और कोड व्यू पर स्विच करें.
  2. फ़ाइल का पूरा कॉन्टेंट, RelativeLayout के अंदर NavigationView के नए लेआउट से बदलें. इसके बारे में, नीचे दिए गए उदाहरण में बताया गया है. जैसा कि आपको ऐप्लिकेशन में सिर्फ़ एक नेविगेशन व्यू जोड़ना है, उसी तरह आसान लेआउट की मदद से भी काम किया जा सकता है.
  3. अपने नेविगेशन व्यू को "@+id/navigation_view" का आईडी दें.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent">
 <com.google.android.libraries.navigation.NavigationView
     android:id="@+id/navigation_view"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
      />
</RelativeLayout>

नेविगेशन गतिविधि सेट अप करना

Android Studio के एडिटर में MainActivity.kt फ़ाइल खोलें.

कुछ बुनियादी सेटअप कोड जोड़ें, ताकि यह पक्का किया जा सके कि आपके ऐप्लिकेशन में नेविगेशन का अनुभव सही तरीके से काम कर रहा है. MainActivity.kt फ़ाइल में, ये बदलाव करें:

  1. अपने NavigationView का रेफ़रंस देने के लिए, अपनी MainActivity क्लास में किसी वैरिएबल का एलान करें:
private lateinit var navView: NavigationView
  1. अपने NavigationView का रेफ़रंस पाने के लिए, onCreate() तरीके में कुछ कोड जोड़ें:
navView = findViewById(R.id.navigation_view)
navView.onCreate(savedInstanceState)
  1. onCreate() तरीके में कुछ कोड जोड़ें, ताकि यह पक्का किया जा सके कि नेविगेशन के दौरान दिशा-निर्देश के दौरान स्क्रीन चालू रहे:
// Ensure the screen stays on during nav.
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
  1. अपने NavigationView के आईडी का रेफ़रंस देने के लिए, ViewCompat.setOnApplyWindowInsetsListener को कॉल करने वाले कोड में बदलाव करें.
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.navigation_view)) { v, insets ->
  val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
  v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
  insets
}
  1. उपयोगकर्ता को सुझाव/राय देने या शिकायत करने के लिए, क्लास में कोई showToast() तरीका जोड़ें:
private fun showToast(errorMessage: String) {
   Toast.makeText(this@MainActivity, errorMessage, Toast.LENGTH_LONG).show()
}

7. Navigation SDK टूल को शुरू करना

नेविगेशन गतिविधि का बुनियादी सेटअप पूरा करने के बाद, नेविगेशन एसडीके टूल को शुरू किया जा सकता है. ऐसा करने के लिए, अपनी MainActivity.kt फ़ाइल में यह कोड जोड़ें:

/** Starts the Navigation API, capturing a reference when ready. */
@SuppressLint("MissingPermission")
private fun initializeNavigationApi() {
   NavigationApi.getNavigator(
       this,
       object : NavigatorListener {
           override fun onNavigatorReady(navigator: Navigator) {
               // store a reference to the Navigator object
               mNavigator = navigator
               // code to start guidance will go here
           }

           override fun onError(@NavigationApi.ErrorCode errorCode: Int) {
               when (errorCode) {
                   NavigationApi.ErrorCode.NOT_AUTHORIZED -> {
                       // Note: If this message is displayed, you may need to check that
                       // your API_KEY is specified correctly in AndroidManifest.xml
                       // and is been enabled to access the Navigation API
                       showToast(
                           "Error loading Navigation API: Your API key is " +
                                   "invalid or not authorized to use Navigation."
                       )
                   }
                   NavigationApi.ErrorCode.TERMS_NOT_ACCEPTED -> {
                       showToast(
                           "Error loading Navigation API: User did not " +
                                   "accept the Navigation Terms of Use."
                       )
                   }
                   else -> showToast("Error loading Navigation API: $errorCode")
               }
           }
       },
   )

}

यह कोड, initializeNavigationApi() नाम का एक नया तरीका बनाता है. यह तरीका, NavigationApi.getNavigator() को कॉल करके Navigator ऑब्जेक्ट का रेफ़रंस पाता है. साथ ही, कॉलबैक को मैनेज करने के लिए NavigatorListener को लागू करता है.

ध्यान दें कि जब Navigation API को शुरू किया जाएगा, तो NavigationListener.onNavigatorReady तरीके को पैरामीटर के तौर पर पास किए गए Navigator ऑब्जेक्ट के साथ शुरू किया जाएगा. ऊपर दिया गया कोड, आपके पहले से तय किए गए mNavigator वैरिएबल को, इस तरीके में इस्तेमाल किए गए Navigator ऑब्जेक्ट के साथ अपडेट करेगा.

आखिर में, onLocationPermissionGranted तरीके से अपने initializeNavigationApi तरीके को कॉल करें.

private fun onLocationPermissionGranted() {
   initializeNavigationApi()
}

8. मुख्य नेविगेशन इवेंट के लिए, लिसनर जोड़ें

जब आपके उपयोगकर्ता निर्देशों का पालन कर रहे होंगे, तब नेविगेशन SDK टूल ऐसे इवेंट ट्रिगर करेगा जो रास्ते में होने वाले मुख्य बदलावों के बारे में ऐप्लिकेशन को सूचना दे सकते हैं. जैसे, जब उपयोगकर्ता किसी दूसरे रास्ते पर जाता है या अपने डेस्टिनेशन पर पहुंचता है. MainActivity.kt फ़ाइल में, इन इवेंट को मैनेज करने के लिए लिसनर जोड़ें:

  1. MainActivity क्लास में, इवेंट लिसनर ऑब्जेक्ट का रेफ़रंस देने के लिए दो वैरिएबल का एलान करें:
private var arrivalListener: Navigator.ArrivalListener? = null
private var routeChangedListener: Navigator.RouteChangedListener? = null
  1. नेविगेटर शुरू होने पर, लिसनर सेट अप करने के लिए registerNavigationListeners() तरीका जोड़ें. यह तरीका, पहुंचने का इवेंट ट्रिगर होने पर NavigationView को रीसेट करने के लिए Navigator.clearDestinations() को कॉल करता है:
/**
* Registers a number of example event listeners that show an on screen message when certain
* navigation events occur (e.g. the driver's route changes or the destination is reached).
*/
private fun registerNavigationListeners() {
   withNavigatorAsync {
       arrivalListener =
           Navigator.ArrivalListener { // Show an onscreen message
               showToast("User has arrived at the destination!")
               mNavigator?.clearDestinations()
           }
       mNavigator?.addArrivalListener(arrivalListener)

       routeChangedListener =
           Navigator.RouteChangedListener { // Show an onscreen message when the route changes
               showToast("onRouteChanged: the driver's route changed")
           }
       mNavigator?.addRouteChangedListener(routeChangedListener)
   }
}
  1. initializeNavigationApi तरीके में onNavigatorReady कॉलबैक कोड से registerNavigationListeners() पर कोई कॉल जोड़ें:
override fun onNavigatorReady(navigator: Navigator) {
   // store a reference to the Navigator object
   mNavigator = navigator

   //listen for events en route
   registerNavigationListeners()


}
  1. यूज़र इंटरफ़ेस कॉन्फ़िगर करना. दिशा-निर्देश चलने के दौरान, आपके पास नेविगेशन यूज़र इंटरफ़ेस के अलग-अलग पहलुओं को कंट्रोल करने का विकल्प होता है. कैमरे की पोज़िशन, पसंद के मुताबिक बनाने की एक अहम सुविधा है. onNavigatorReady में navigator ऑब्जेक्ट के setTaskRemovedBehaviour तरीके को कॉल करने के लिए, नीचे दिए गए तरीके का इस्तेमाल करें. अगर ऐप्लिकेशन को स्वाइप करके हटाया जाता है, तो निर्देश और सूचना बंद हो जाएगी:
// Disables the guidance notifications and shuts down the app and background service
// when the user dismisses/swipes away the app from Android's recent tasks.
navigator.setTaskRemovedBehavior(Navigator.TaskRemovedBehavior.QUIT_SERVICE)
  1. CameraPerspective तय करने के लिए, GoogleMap.followMyLocation पर कॉल जोड़ें. GoogleMap को NavigatorView.getMapAsync() तरीके से ऐक्सेस करने के लिए, यह तरीका अपनाएं:
navView.getMapAsync {
   googleMap  ->
   googleMap.followMyLocation(GoogleMap.CameraPerspective.TILTED)
}
  1. यह पक्का करने के लिए कि ऐप्लिकेशन के पूरे लाइफ़साइकल के दौरान, नेविगेशन आसानी से काम करे, अपनी MainActivity क्लास में ये तरीके लागू करें:
override fun onSaveInstanceState(savedInstanceState: Bundle) {
   super.onSaveInstanceState(savedInstanceState)

   navView.onSaveInstanceState(savedInstanceState)
}

override fun onTrimMemory(level: Int) {
   super.onTrimMemory(level)
   navView.onTrimMemory(level)
}

override fun onStart() {
   super.onStart()
   navView.onStart()
}

override fun onResume() {
   super.onResume()
   navView.onResume()
}

override fun onPause() {
   navView.onPause()
   super.onPause()
}

override fun onConfigurationChanged(configuration: Configuration) {
   super.onConfigurationChanged(configuration)
   navView.onConfigurationChanged(configuration)
}

override fun onStop() {
   navView.onStop()
   super.onStop()
}

override fun onDestroy() {
   navView.onDestroy()
   withNavigatorAsync {
       // Unregister event listeners to avoid memory leaks.
       if (arrivalListener != null) {
           navigator.removeArrivalListener(arrivalListener)
       }
       if (routeChangedListener != null) {
           navigator.removeRouteChangedListener(routeChangedListener)
       }

       navigator.simulator?.unsetUserLocation()
       navigator.cleanup()
   }
   super.onDestroy()
}

9. गंतव्य सेट करें

अब आप डेस्टिनेशन सेट करने और नेविगेशन के लिए दिशा-निर्देश शुरू करने के लिए तैयार हैं. MainActivity.kt फ़ाइल में, ये बदलाव करें:

  1. नेविगेशन डेस्टिनेशन सेट करने और placeId पैरामीटर को स्वीकार करने वाला नया navigateToPlace() तरीका जोड़ें.
/**
* Requests directions from the user's current location to a specific place (provided by the
* Place ID).
*/
private fun navigateToPlace(placeId: String) {

}
  1. अपने navigateToPlace() तरीके में, Waypoint.builder() तरीके का इस्तेमाल करके, उस प्लेस आईडी से Waypoint बनाएं जिसे इस तरीके में पास किया गया है. ऐसी स्थितियों में जहां जगह का आईडी सटीक पते से नहीं जुड़ता, उन स्थितियों में UnsupportedPlaceIdException को हैंडल करने का तरीका:
val waypoint: Waypoint? =
// Set a destination by using a Place ID (the recommended method)
try {
   Waypoint.builder().setPlaceIdString(placeId).build()
} catch (e: Waypoint.UnsupportedPlaceIdException) {
   showToast("Place ID was unsupported.")
   return
}
  1. वेपॉइंट का इस्तेमाल करके डेस्टिनेशन सेट करने के लिए, अपने navigateToPlace() तरीके में यह कोड जोड़ें:
val pendingRoute = mNavigator?.setDestination(waypoint)

// Set an action to perform when a route is determined to the destination
pendingRoute?.setOnResultListener { code ->
   when (code) {
       RouteStatus.OK -> {
           // Code to start guidance will go here
       }

       RouteStatus.ROUTE_CANCELED -> showToast("Route guidance canceled.")
       RouteStatus.NO_ROUTE_FOUND,
       RouteStatus.NETWORK_ERROR ->
           // TODO: Add logic to handle when a route could not be determined
           showToast("Error starting guidance: $code")

       else -> showToast("Error starting guidance: $code")
   }
}

Navigator ऑब्जेक्ट में, setDestinations() तरीका इस्तेमाल किया गया है. यह तरीका कई तरह के पैरामीटर इस्तेमाल कर सकता है. सबसे बुनियादी विकल्प, Waypoint देना है. यह डिफ़ॉल्ट रूप से DRIVING का यात्रा मोड इस्तेमाल करेगा, जो चार पहिया कारों के लिए सही है. setDestinations() तरीका, ListenableResultFuture ऑब्जेक्ट दिखाता है, जिसमें RouteStatus ऑब्जेक्ट होता है. RouteStatus से पता चलेगा कि डेस्टिनेशन तक कोई रास्ता मिला है या नहीं. अगर नहीं मिला है, तो गड़बड़ी की अलग-अलग स्थितियों को मैनेज किया जा सकता है.

  1. नेविगेशन के उपयोगकर्ता अनुभव को बेहतर बनाने के लिए, कॉन्फ़िगरेशन में अन्य बदलाव करें:
// Hide the toolbar to maximize the navigation UI
supportActionBar?.hide()

// Enable voice audio guidance (through the device speaker)
mNavigator?.setAudioGuidance(Navigator.AudioGuidance.VOICE_ALERTS_AND_GUIDANCE)


// Simulate vehicle progress along the route (for demo/debug builds)
if (BuildConfig.DEBUG) {
   mNavigator?.simulator?.simulateLocationsAlongExistingRoute(
       SimulationOptions().speedMultiplier(5f)
   )
}

इन बदलावों में ये सुधार शामिल हैं:

  • नेविगेशन यूज़र इंटरफ़ेस (यूआई) के लिए जगह बढ़ाने के लिए कार्रवाई बार को छिपाया जा रहा है.
  • सूचनाएं और नेविगेशन के निर्देश बोलने के लिए, आवाज़ से रास्ता बताने की सुविधा चालू की जा रही है.
  • स्पीड मल्टीप्लायर तय करके, डीबग करने के लिए सिम्युलेटर सेट अप करना.
  1. कोई ऐसा प्लेस आईडी ढूंढें जो आपकी मंज़िल के तौर पर काम करेगा. आम तौर पर, यह जगह उपयोगकर्ता की जगह से बहुत ज़्यादा दूर नहीं होगी. Google Maps Platform स्थान आईडी खोजक सुविधा का इस्तेमाल करें या Places API कॉल से स्थान आईडी पाएं.

नेविगेशन को सिम्युलेट करने के लिए, उपयोगकर्ता की जगह की जानकारी को कोड में सेट किया जा सकता है या कनेक्ट किए गए डिवाइस से लिया जा सकता है. कोडलैब में यह माना जाएगा कि आपने यूनाइटेड किंगडम के लंदन की जगह को सिम्युलेट किया है.

  1. शुरू करने की जगह और जगह का आईडी सेव करने के लिए, अपनी MainActivity क्लास में साथी ऑब्जेक्ट जोड़ें. इस कोडलैब में, लंदन में शुरू होने वाली जगह और Trafalgar Square के प्लेस आईडी का इस्तेमाल किया जाएगा:
companion object{
   const val TRAFALGAR_SQUARE ="ChIJH-tBOc4EdkgRJ8aJ8P1CUxo" //London, UK
   val startLocation = LatLng(51.345678, -0.1234456)
}
  1. initializeNavigationApi तरीके में मौजूद onNavigatorReady कॉलबैक से, अपने navigateToPlace() तरीके में कोई कॉल जोड़ें. साथ ही, लॉजिक की एक ऐसी ब्रांच जोड़ें जो डीबग मोड में एक्ज़ीक्यूट होगी, जो उपयोगकर्ता की लोकेशन सेट करती है:
// Disables the guidance notifications and shuts down the app and background service
// when the user dismisses/swipes away the app from Android's recent tasks.
navigator.setTaskRemovedBehavior(Navigator.TaskRemovedBehavior.QUIT_SERVICE)

mNavigator = navigator

if (BuildConfig.DEBUG) {
   mNavigator?.simulator?.setUserLocation(MainActivity.startLocation)
}
//listen for events en route
registerNavigationListeners()

navView.getMapAsync {
   googleMap  ->
   googleMap.followMyLocation(GoogleMap.CameraPerspective.TILTED)
}

//navigate to a destination
navigateToPlace(MainActivity.TRAFALGAR_SQUARE)

10. अपना कोड बनाना और चलाना

ऐप्लिकेशन को पहली बार इस्तेमाल करने पर, आपको उसे जगह की जानकारी की अनुमतियां देनी होंगी. साथ ही, नेविगेशन SDK टूल इस्तेमाल करने की शर्तों को स्वीकार करना होगा.

ध्यान दें: ऐप्लिकेशन को चलाने पर, setDestinations() मेथड को कॉल किया जाएगा. इस मेथड का इस्तेमाल करने पर, 1,000 डेस्टिनेशन के बाद शुल्क लिया जाएगा. ज़्यादा जानकारी के लिए इस्तेमाल और बिलिंग देखें.

93aa433000a14dfc.png

Navigation SDK टूल के लिए, असली उपयोगकर्ता की शर्तों वाला डायलॉग.

जगह की जानकारी सेट करना

डिफ़ॉल्ट रूप से, एमुलेट किए गए डिवाइस की जगह की जानकारी, माउंटेन व्यू, कैलिफ़ोर्निया में मौजूद Google कैंपस पर सेट हो सकती है. ऐसा तब तक होता है, जब तक कि आपने कोड में जगह की जानकारी सेट नहीं की है या एमुलेटर प्रॉपर्टी डायलॉग का इस्तेमाल नहीं किया है.

अगर ऐसा है, तो हो सकता है कि ऐप्लिकेशन आपके कॉन्फ़िगर किए गए प्लेस आईडी (डिफ़ॉल्ट रूप से, सिडनी ऑपेरा हाउस, सिडनी, ऑस्ट्रेलिया) का रास्ता न ढूंढ पाए. इसकी जानकारी, "कोई रास्ता नहीं मिला" मैसेज के ज़रिए दी जाएगी. यह मैसेज, showToast() तरीके से दिखेगा.

नेविगेशन ऐप्लिकेशन का मैप व्यू, जिसमें कैलिफ़ोर्निया के माउंटेन व्यू में Google का ऑफ़िस दिखाया गया है.

शुरुआत की जगह को हार्ड कोडिंग करना

कोड में कोई दूसरी जगह सेट करने के लिए, MainActivity.kt में navigateToPlace() कॉल करने से पहले, अपने navigateToPlace() तरीके में यह लाइन जोड़ें:

mNavigator?.simulator?.setUserLocation(startLocation)

अपनी पसंद की डिफ़ॉल्ट जगह पर एमुलेटर को शुरू करना

डिवाइस एम्युलेटर में कोई दूसरी जगह सेट करने के लिए, अगर एम्युलेटर पहले से नहीं चल रहा है, तो उसे शुरू करें. इसके बाद, "एक्सटेंडेड कंट्रोल" टूलटिप के साथ तीन बिंदु वाले मेन्यू पर क्लिक करें. इसके बाद खुलने वाले डायलॉग बॉक्स में, "जगह" के लिए मेन्यू विकल्प होता है.

उदाहरण के लिए, अगर डेस्टिनेशन के तौर पर, प्लेस आईडी ऑफ़ सिडनी ऑपरा हाउस का इस्तेमाल किया जा रहा है, तो सिडनी, ऑस्ट्रेलिया में कोई जगह चुनें. उदाहरण के लिए, "Bondi समुद्र तट" खोजें, कोई सुझाव चुनें, और "जगह सेव करें" पर क्लिक करें क्लिक करें. आपके पास "पॉइंट सेव करने" पर क्लिक करने का भी विकल्प है सेव की गई सूची में जगह की जानकारी जोड़ें, ताकि आने वाले समय में इस्तेमाल किया जा सके.

Android डिवाइस मैनेजर में ज़्यादा कंट्रोल वाला डायलॉग, जिसमें जगह चुनने वाला टूल और ऑस्ट्रेलिया के बॉन्डी बीच के बीच में मौजूद मैप दिख रहा है.

अगर आपने डेस्टिनेशन के तौर पर कोई दूसरा प्लेस आईडी सेट किया है, तो उसके आस-पास की कोई जगह चुनें, ताकि सिम्युलेट किया गया रास्ता ज़्यादा असरदार हो और डीबग करने में आसानी हो.

ऐप्लिकेशन रीस्टार्ट करें. इससे अब वह डेस्टिनेशन पर पहुंच जाएगा.

नेविगेशन ऐप्लिकेशन का स्क्रीनशॉट, जिसमें डेस्टिनेशन के बारे में दिशा-निर्देश दिए गए हैं.

11. बधाई हो!

आपने यह कोडलैब पूरा कर लिया है. बहुत बढ़िया - आप अपने गंतव्य पर पहुंच गए हैं! कोडिंग करते रहें :-)

55812f33256c0596.png

12. इसे और बेहतर बनाना

अगर आपको अपने ऐप्लिकेशन को और बेहतर बनाना है, तो इन विषयों पर गौर करें.