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

ज़रूरी शर्तें
- Kotlin में Android ऐप्लिकेशन डेवलपमेंट की बुनियादी जानकारी
- Google Maps SDK के बुनियादी कॉन्सेप्ट के बारे में कुछ जानकारी होनी चाहिए. जैसे, मैप, जगहें, निर्देशांक.
आपको क्या सीखने को मिलेगा
- एक ऐसा सामान्य Android ऐप्लिकेशन बनाने का तरीका जो किसी जगह पर जाने के लिए Navigation SDK का इस्तेमाल करता हो.
- Google Maven की रिमोट रिपॉज़िटरी से Navigation SDK को इंटिग्रेट करने का तरीका
- जगह की जानकारी के ऐक्सेस की अनुमतियों और Navigation SDK के असली उपयोगकर्ता की शर्तों के साथ उपयोगकर्ता के कानूनी समझौते को मैनेज करने का तरीका
- एसडीके टूल को शुरू करने का तरीका
- मंज़िल सेट करने और नेविगेशन के निर्देश पाने की सुविधा शुरू करने का तरीका.
आपको इन चीज़ों की ज़रूरत होगी
- Android Studio का नया स्टेबल वर्शन इंस्टॉल होना चाहिए. इस कोडलैब को Android Studio Jellyfish का इस्तेमाल करके बनाया गया है. अगर किसी दूसरे वर्शन का इस्तेमाल किया जा रहा है, तो इंटरफ़ेस और कॉम्पोनेंट का लेआउट और दिखने का तरीका अलग हो सकता है.
- बिलिंग की सुविधा वाला Google खाता और प्रोजेक्ट.
- डेवलपर मोड में मौजूद Android डिवाइस, जिसमें यूएसबी डीबगिंग चालू हो या Android एम्युलेटर. इनमें से कोई भी विकल्प चुनने पर, यह Navigation SDK की ज़रूरी शर्तों को पूरा करना चाहिए
2. सेट अप करें
अगर आपके पास Google Cloud Platform खाता और बिलिंग की सुविधा वाला प्रोजेक्ट नहीं है, तो Google Cloud प्रोजेक्ट सेट अप करें. इसके लिए, Google Maps Platform का इस्तेमाल शुरू करने से जुड़े निर्देश देखें https://developers.google.com/maps/gmp-get-started
Console में अपना Google Cloud प्रोजेक्ट चुनें
Cloud Console में, प्रोजेक्ट वाले ड्रॉप-डाउन मेन्यू पर क्लिक करें. इसके बाद, उस प्रोजेक्ट को चुनें जिसे इस कोडलैब के लिए इस्तेमाल करना है.

अपने प्रोजेक्ट में Navigation SDK चालू करना
इस कोडलैब के लिए ज़रूरी Google Maps Platform API और एसडीके को Google Cloud Marketplace में जाकर चालू करें.
Google Cloud Console में, एपीआई और सेवाएं > लाइब्रेरी पर जाएं. इसके बाद, "Navigation SDK" खोजें.
आपको खोज का एक नतीजा दिखेगा.

Navigation SDK के नतीजे पर क्लिक करके, प्रॉडक्ट की ज़्यादा जानकारी वाला पेज खोलें. अपने प्रोजेक्ट पर एसडीके चालू करने के लिए, 'चालू करें' बटन पर क्लिक करें.
Android के लिए Google Maps SDK के लिए भी यही प्रोसेस दोहराएं.
एपीआई पासकोड बनाना
Cloud Console के क्रेडेंशियल पेज पर जाकर, एक एपीआई पासकोड जनरेट करें. Google Maps Platform का इस्तेमाल शुरू करना में, क्विकस्टार्ट सेक्शन के तीसरे चरण में दिए गए निर्देशों का पालन करें. Google Maps Platform का इस्तेमाल करने के लिए, एपीआई पासकोड ज़रूरी है.
3. सैंपल प्रोजेक्ट की फ़ाइलें पाना
इस सेक्शन में, इस कोडलैब के लिए GitHub रिपॉज़िटरी से फ़ाइलें क्लोन करके, बुनियादी तौर पर खाली Android Studio प्रोजेक्ट सेट अप करने का तरीका बताया गया है. Github के रेपो में, कोडलैब के कोड के पहले और बाद के वर्शन मौजूद हैं. यह कोडलैब, खाली प्रोजेक्ट टेंप्लेट से शुरू होगा और आखिर में पूरा हो जाएगा. अगर आपको कोई समस्या आती है, तो repo में मौजूद पूरे प्रोजेक्ट का इस्तेमाल रेफ़रंस के तौर पर किया जा सकता है.
इस कोडलैब का कोड पाने के लिए, इस GitHub रेपो को क्लोन करें.
git clone https://github.com/googlemaps-samples/codelab-navigation-101-android-kotlin.git
अगर आपके पास git इंस्टॉल नहीं है, तो कोड पाने के लिए इस बटन पर क्लिक करें:
इस कोडलैब को आसानी से समझने के लिए, repo में Starter फ़ोल्डर में कुछ स्टार्टर कोड दिया गया है. स्टार्टर प्रोजेक्ट में, ऐप्लिकेशन का बुनियादी यूज़र इंटरफ़ेस (यूआई) और बिल्ड कॉन्फ़िगरेशन मिलता है. हालांकि, इसमें Navigation SDK नहीं जोड़ा गया है. अगर आपको आगे बढ़ना है या किसी भी समय अपनी प्रोग्रेस देखनी है, तो यहां एक पूरा किया गया Solution प्रोजेक्ट भी दिया गया है.
क्लोन किए गए रेपो को Android Studio में खोलना
रेपो को स्थानीय तौर पर क्लोन करने के बाद, Android Studio का इस्तेमाल करके Starter फ़ोल्डर को मौजूदा प्रोजेक्ट के तौर पर खोलें.
- 'Android Studio में आपका स्वागत है' डायलॉग में जाकर, 'खोलें' बटन पर क्लिक करें.
- उस फ़ोल्डर पर जाएं जहां आपने क्लोन की गई रेपो सेव की है. इसके बाद, टॉप लेवल के "
codelab-navigation-101-android-kotlin" फ़ोल्डर में मौजूदStarterफ़ोल्डर को चुनें. - देखें कि प्रोजेक्ट बन रहा हो और चल रहा हो.
कोई वर्चुअल डिवाइस जोड़ना या कोई हार्डवेयर डिवाइस कनेक्ट करना
किसी Android डिवाइस को अपने कंप्यूटर से कनेक्ट करने के लिए, Android Studio में दिए गए निर्देशों का पालन करें. इन निर्देशों में, हार्डवेयर डिवाइस पर ऐप्लिकेशन चलाने का तरीका बताया गया है. इसके अलावा, Android वर्चुअल डिवाइस (AVD) मैनेजर का इस्तेमाल करके, वर्चुअल डिवाइस को कॉन्फ़िगर किया जा सकता है. एम्युलेटर चुनते समय, पक्का करें कि आपने ऐसी इमेज चुनी हो जिसमें Google API शामिल हों.
Android Studio में, 'चलाएं' मेन्यू विकल्प या 'चलाएं' बटन आइकॉन पर क्लिक करें. स्क्रीन पर दिए गए निर्देशों के मुताबिक, कोई डिवाइस चुनें.
4. अपने ऐप्लिकेशन में Navigation SDK जोड़ना
अपने प्रोजेक्ट में Navigation SDK लाइब्रेरी और एपीआई पासकोड जोड़ना
अपने ऐप्लिकेशन में Navigation SDK लाइब्रेरी जोड़ने के लिए, आपको ऐप्लिकेशन-लेवल build.gradle.kts में बदलाव करना होगा, ताकि Google Maven रिपॉज़िटरी से Navigation SDK को फ़ेच किया जा सके और वर्शन नंबर कॉन्फ़िगर किया जा सके.
Navigation SDK टूल के वर्शन नंबर को सेव करने के लिए, अपने बिल्ड कॉन्फ़िगरेशन में एक वैरिएबल बनाएं.
अपने ऐप्लिकेशन-लेवल build.gradle.kts में एक वैरिएबल सेट अप करें, ताकि आपके ऐप्लिकेशन में इस्तेमाल किए गए Navigation SDK के वर्शन की वैल्यू शामिल की जा सके. इससे आने वाले समय में, इसे नए वर्शन में आसानी से बदला जा सकेगा.
नए वर्शन नंबर के लिए, Navigation SDK के रिलीज़ नोट देखें.
val navSdkVersion by extra("6.0.0")
फ़ाइल > प्रोजेक्ट स्ट्रक्चर > वैरिएबल में जाकर, इस और अन्य वैरिएबल की वैल्यू में बदलाव भी किया जा सकता है:

बिल्ड कॉन्फ़िगरेशन में कोई डिपेंडेंसी जोड़ना
अब अपने ऐप्लिकेशन-लेवल की 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
इस विषय के बारे में ज़्यादा जानने के लिए, Navigation SDK के दस्तावेज़ में अपने ऐप्लिकेशन में एपीआई पासकोड जोड़ना लेख पढ़ें.
local.defaults.properties फ़ाइल के कॉन्टेंट की पुष्टि करना
खाली प्रोजेक्ट में, आपकी टॉप-लेवल डायरेक्ट्री में एक local.defaults.properties फ़ाइल भी होती है. यह फ़ाइल, secrets.properties फ़ाइल वाले फ़ोल्डर में ही होती है. इसे खोलें और यहां दिया गया कोड देखें.
MAPS_API_KEY=DEFAULT_API_KEY
यह MAPS_API_KEY प्रॉपर्टी के लिए बैकअप वैल्यू उपलब्ध कराने के लिए मौजूद है. ऐसा तब होता है, जब प्रोजेक्ट में secrets.properties को नहीं जोड़ा जाता है, ताकि बिल्ड फ़ेल न हों. इस फ़ाइल में बदलाव करने की ज़रूरत नहीं है. अगर secrets.properties की MAPS_API_KEY परिभाषा नहीं मिलती है, तो डिफ़ॉल्ट वैल्यू, रनटाइम के दौरान ऐप्लिकेशन को चलने से रोक देगी. साथ ही, एपीआई पासकोड से जुड़ी गड़बड़ी दिखेगी.
देखें कि 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. ऐप्लिकेशन की अनुमतियां कॉन्फ़िगर करना और बुनियादी यूज़र इंटरफ़ेस जोड़ना
जगह की सटीक जानकारी ऐक्सेस करने की अनुमति का अनुरोध करना
Navigation 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 में नई और खाली Views गतिविधि बनाते समय बनाए गए यूज़र इंटरफ़ेस का इस्तेमाल करता है. नेविगेशन यूज़र इंटरफ़ेस (यूआई) के लिए गतिविधि में कोड जोड़ने से पहले, आपको इस कोड को लोकेशन की अनुमति की जांच करने के लिए इस्तेमाल करना होगा.
कोड एडिटर में MainActivity.kt फ़ाइल खोलें और कोड की जांच करें. इसमें बुनियादी यूज़र इंटरफ़ेस (यूआई) दिखता है.
रनटाइम के दौरान, जगह की जानकारी ऐक्सेस करने की अनुमतियों का अनुरोध करना
Navigation 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 का इस्तेमाल किया गया है.
लेआउट में बदलाव करना
NavigationView के लिए लेआउट जोड़ने के लिए, res/layout/activity_main.xml में बदलाव करें.
- फ़ाइल खोलें और कोड व्यू पर स्विच करें.
- फ़ाइल के पूरे कॉन्टेंट को,
RelativeLayoutके अंदर मौजूदNavigationViewके नए लेआउट से बदलें. उदाहरण के लिए, यहां दिया गया तरीका अपनाएं. आपको ऐप्लिकेशन में सिर्फ़ एक नेविगेशन व्यू जोड़ना है. इसलिए, एक सामान्य लेआउट का इस्तेमाल किया जा सकता है. - अपने NavigationView को "
@+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 फ़ाइल में, ये बदलाव करें:
- अपनी
MainActivityक्लास में एक वैरिएबल का एलान करें, ताकिNavigationViewको रेफ़र किया जा सके:
private lateinit var navView: NavigationView
- अपने
NavigationViewका रेफ़रंस पाने के लिए,onCreate()तरीके में कुछ कोड जोड़ें:
navView = findViewById(R.id.navigation_view)
navView.onCreate(savedInstanceState)
onCreate()तरीके में कुछ कोड जोड़ें, ताकि नेविगेशन के दौरान स्क्रीन चालू रहे:
// Ensure the screen stays on during nav.
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
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
}
- उपयोगकर्ता को सुझाव/राय दिखाने के लिए, क्लास में
showToast()तरीका जोड़ें:
private fun showToast(errorMessage: String) {
Toast.makeText(this@MainActivity, errorMessage, Toast.LENGTH_LONG).show()
}
7. Navigation SDK को शुरू करना
नेविगेशन गतिविधि का बुनियादी सेटअप पूरा करने के बाद, अब 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. मुख्य नेविगेशन इवेंट के लिए लिसनर जोड़ना
जब उपयोगकर्ता दिशा-निर्देशों का पालन कर रहे होते हैं, तब Navigation SDK ऐसे इवेंट ट्रिगर करता है जो ऐप्लिकेशन को रास्ते में होने वाले मुख्य बदलावों के बारे में सूचना दे सकते हैं. जैसे, जब उपयोगकर्ता रास्ता बदलता है या अपनी मंज़िल पर पहुंचता है. MainActivity.kt फ़ाइल में, इन इवेंट को हैंडल करने के लिए लिसनर जोड़ें:
- इवेंट लिसनर ऑब्जेक्ट को रेफ़र करने के लिए,
MainActivityक्लास में दो वैरिएबल घोषित करें:
private var arrivalListener: Navigator.ArrivalListener? = null
private var routeChangedListener: Navigator.RouteChangedListener? = null
- नेविगेटर शुरू होने पर, लिसनर सेट अप करने के लिए
registerNavigationListeners()तरीका जोड़ें. जब Arrival इवेंट ट्रिगर होता है, तब यह तरीकाNavigator.clearDestinations()को कॉल करकेNavigationViewको रीसेट करता है:
/**
* 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)
}
}
initializeNavigationApiतरीके में,onNavigatorReadyकॉलबैक कोड सेregisterNavigationListeners()पर कॉल करने की सुविधा जोड़ें:
override fun onNavigatorReady(navigator: Navigator) {
// store a reference to the Navigator object
mNavigator = navigator
//listen for events en route
registerNavigationListeners()
}
- यूज़र इंटरफ़ेस को कॉन्फ़िगर करें. निर्देशों के चालू होने पर, नेविगेशन यूज़र इंटरफ़ेस के अलग-अलग पहलुओं को कंट्रोल किया जा सकता है. कैमरे की पोज़िशन को पसंद के मुताबिक बनाना एक ज़रूरी सेटिंग है.
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)
CameraPerspectiveतय करने के लिए,GoogleMap.followMyLocationको कॉल करें.GoogleMapकोNavigatorView.getMapAsync()तरीके से ऐक्सेस किया जाता है. इसके लिए, यह तरीका अपनाएं:
navView.getMapAsync {
googleMap ->
googleMap.followMyLocation(GoogleMap.CameraPerspective.TILTED)
}
- यह पक्का करने के लिए कि ऐप्लिकेशन के पूरे लाइफ़साइकल में नेविगेशन की सुविधा ठीक से काम करे, अपनी
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 फ़ाइल में, ये बदलाव करें:
- एक नया
navigateToPlace()तरीका जोड़ें. यह नेविगेशन डेस्टिनेशन सेट करता है औरplaceIdपैरामीटर स्वीकार करता है.
/**
* Requests directions from the user's current location to a specific place (provided by the
* Place ID).
*/
private fun navigateToPlace(placeId: String) {
}
- अपनी
navigateToPlace()विधि में,Waypoint.builder()विधि का इस्तेमाल करके, विधि को पास किए गए Place ID से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
}
- वेपॉइंट का इस्तेमाल करके डेस्टिनेशन सेट करने के लिए, अपने
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 से पता चलेगा कि डेस्टिनेशन तक पहुंचने का रास्ता मिला है या नहीं. अगर रास्ता नहीं मिला है, तो इससे आपको गड़बड़ी की अलग-अलग स्थितियों को मैनेज करने में मदद मिलेगी.
- नेविगेशन के उपयोगकर्ता अनुभव को बेहतर बनाने के लिए, कॉन्फ़िगरेशन में ये बदलाव करें:
// 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)
)
}
इन बदलावों में ये सुधार शामिल हैं:
- नेविगेशन यूज़र इंटरफ़ेस (यूआई) के लिए ज़्यादा से ज़्यादा जगह बनाने के लिए, ऐक्शन बार को छिपाया जा रहा है.
- आवाज़ से निर्देश देने की सुविधा चालू करने पर, सूचनाएँ और नेविगेशन के निर्देश बोलकर सुनाए जाते हैं.
- स्पीड मल्टीप्लायर तय करके, डीबग करने के लिए सिम्युलेटर सेट अप करना.
- वह जगह का आईडी ढूंढें जिसे आपको अपनी मंज़िल के तौर पर सेट करना है. आम तौर पर, यह जगह उपयोगकर्ता की जगह से ज़्यादा दूर नहीं होगी. Google Maps Platform Place ID Finder यूटिलिटी का इस्तेमाल करें या Places API कॉल से जगह का आईडी पाएं.
अगर आपको नेविगेशन की सुविधा को सिम्युलेट करना है, तो कोड में उपयोगकर्ता की जगह की जानकारी सेट की जा सकती है. इसके अलावा, कनेक्ट किए गए डिवाइस से भी यह जानकारी ली जा सकती है. इस कोडलैब में यह माना जाएगा कि आपने यूनाइटेड किंगडम के लंदन शहर की जगह की जानकारी को सिम्युलेट किया है.
- शुरुआत की जगह और जगह का आईडी सेव करने के लिए, अपनी
MainActivityक्लास में एक कंपैनियन ऑब्जेक्ट जोड़ें. इस कोडलैब में, लंदन में मौजूद किसी जगह से शुरुआत की जाएगी. साथ ही, ट्रैफ़लगार स्क्वेयर के प्लेस आईडी का इस्तेमाल किया जाएगा:
companion object{
const val TRAFALGAR_SQUARE ="ChIJH-tBOc4EdkgRJ8aJ8P1CUxo" //London, UK
val startLocation = LatLng(51.345678, -0.1234456)
}
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. कोड बनाना और उसे चलाना
पहली बार ऐप्लिकेशन चलाने पर, आपको ऐप्लिकेशन को जगह की जानकारी ऐक्सेस करने की अनुमति देनी होगी. साथ ही, Navigation SDK के इस्तेमाल की शर्तों को स्वीकार करना होगा.
ध्यान दें: ऐप्लिकेशन चलाने पर, setDestinations() तरीके को कॉल किया जाएगा. इसके बाद, इस्तेमाल किए गए पहले 1,000 डेस्टिनेशन के लिए शुल्क लिया जाएगा. ज़्यादा जानकारी के लिए, इस्तेमाल और बिलिंग देखें.


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

शुरुआत की जगह की जानकारी को हार्ड कोड करना
कोड में कोई दूसरी जगह सेट करने के लिए, MainActivity.kt में मौजूद navigateToPlace() तरीके में, mNavigator.startGuidance() को कॉल करने से पहले यह लाइन जोड़ें:
mNavigator?.simulator?.setUserLocation(startLocation)
अपनी पसंद की डिफ़ॉल्ट जगह पर एम्युलेटर शुरू करना
डिवाइस एम्युलेटर में कोई दूसरी जगह सेट करने के लिए, एम्युलेटर को शुरू करें. अगर यह पहले से चालू है, तो इसे बंद करें और फिर शुरू करें. इसके बाद, टूलटिप "एक्सटेंडेड कंट्रोल" वाले तीन बिंदु वाले मेन्यू पर क्लिक करें. खुलने वाले डायलॉग बॉक्स में, "जगह की जानकारी" का मेन्यू विकल्प होता है.
उदाहरण के लिए, अगर आपको सिडनी ओपेरा हाउस के प्लेस आईडी को डेस्टिनेशन के तौर पर इस्तेमाल करना है, तो ऑस्ट्रेलिया के सिडनी में मौजूद किसी जगह को चुनें. उदाहरण के लिए, "बॉन्डी बीच" खोजें, कोई सुझाव चुनें, और डायलॉग बॉक्स में सबसे नीचे दाईं ओर मौजूद "जगह सेव करें" पर क्लिक करें. बाद में इस्तेमाल करने के लिए, जगह को सेव की गई सूची में जोड़ने के लिए, "सेव किया गया पॉइंट" पर भी क्लिक किया जा सकता है.

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

11. बधाई हो!
आपने यह कोडलैब पूरा कर लिया है. बहुत बढ़िया - आप अपनी मंज़िल पर पहुंच गए हैं! कोडिंग करते रहें :-)

12. आगे की कार्रवाई
अगर आपको ऐप्लिकेशन डेवलपमेंट को आगे बढ़ाना है, तो प्रेरणा पाने के लिए इन विषयों पर एक नज़र डालें.
- नेविगेशन से जुड़े ज़्यादा इवेंट के लिए सुनें. अगर ड्राइवर रास्ता बदलता है या जब वह पहुंचता है, तो मैसेज दिखाने के लिए कोड जोड़ें.
- नेविगेशन इंटरफ़ेस को पसंद के मुताबिक बनाएं.
- अगर आपको कोई बड़ी चुनौती चाहिए, तो देखें कि क्या Places API Place Picker कंट्रोल को जोड़ा जा सकता है, ताकि उपयोगकर्ता डेस्टिनेशन सेट कर सके. अहम जानकारी: GitHub पर मौजूद Navigation SDK के डेमो ऐप्लिकेशन में, लागू करने का सैंपल दिया गया है.
- Github पर मौजूद Navigation SDK के डेमो ऐप्लिकेशन में इस्तेमाल किए गए तरीके को अपनाकर, Navigator और GoogleMap ऑब्जेक्ट को एसिंक्रोनस तरीके से कॉल करने में आने वाली संभावित समस्याओं को रोकें. ऐप्लिकेशन के ज़्यादा जटिल उदाहरणों में, हो सकता है कि आपका कोड चलने के दौरान ये ऑब्जेक्ट पूरी तरह से शुरू न हुए हों. सलाह: बहुत तेज़ी से लागू करने के लिए, MainActivity.kt फ़ाइल के आखिर में InitializedNavScope क्लास को जोड़ा जा सकता है.