1. शुरू करने से पहले
इस कोडलैब में, आपको एक ऐसा आसान Android ऐप्लिकेशन बनाने का तरीका बताया गया है जो पहले से कॉन्फ़िगर किए गए डेस्टिनेशन पर जाने के लिए, Google Maps Platform Navigation SDK टूल का इस्तेमाल करता है.
प्रोसेस पूरी होने के बाद, आपका ऐप्लिकेशन कुछ ऐसा दिखेगा.
ज़रूरी शर्तें
- 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 में, प्रोजेक्ट के ड्रॉप-डाउन मेन्यू पर क्लिक करें और वह प्रोजेक्ट चुनें जिसका इस्तेमाल आपको इस कोडलैब के लिए करना है.
अपने प्रोजेक्ट में नेविगेशन SDK टूल चालू करना
इस कोडलैब के लिए ज़रूरी Google Maps Platform API और SDK को Google Cloud Marketplace में जाकर चालू करें.
Google Cloud Console में, एपीआई और सेवाएं > लाइब्रेरी पर जाएं और "Navigation 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 का इस्तेमाल करें.
- 'Android Studio में आपका स्वागत है' डायलॉग में, 'खोलें' बटन पर क्लिक करें.
- उस फ़ोल्डर पर जाएं जहां आपने क्लोन किए गए रेपो को सेव किया है. इसके बाद, टॉप लेवल "
codelab-navigation-101-android-kotlin
" मेंStarter
फ़ोल्डर चुनें फ़ोल्डर खोलें. - देखें कि प्रोजेक्ट बनता है और चलता है.
वर्चुअल डिवाइस जोड़ना या हार्डवेयर डिवाइस कनेक्ट करना
किसी 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")
फ़ाइल > प्रोजेक्ट का स्ट्रक्चर > वैरिएबल में जाकर, डायलॉग बॉक्स का इस्तेमाल करके भी इस और दूसरे वैरिएबल की वैल्यू में बदलाव किया जा सकता है:
बिल्ड कॉन्फ़िगरेशन में डिपेंडेंसी जोड़ना
अब अपने ऐप्लिकेशन-लेवल पर डिपेंडेंसी ब्लॉक में यहां दी गई एपीआई डिपेंडेंसी जोड़ें 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
में बदलाव करें.
- फ़ाइल खोलें और कोड व्यू पर स्विच करें.
- फ़ाइल का पूरा कॉन्टेंट,
RelativeLayout
के अंदर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 फ़ाइल में, ये बदलाव करें:
- अपने
NavigationView
का रेफ़रंस देने के लिए, अपनीMainActivity
क्लास में किसी वैरिएबल का एलान करें:
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 टूल को शुरू करना
नेविगेशन गतिविधि का बुनियादी सेटअप पूरा करने के बाद, नेविगेशन एसडीके टूल को शुरू किया जा सकता है. ऐसा करने के लिए, अपनी 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 फ़ाइल में, इन इवेंट को मैनेज करने के लिए लिसनर जोड़ें:
MainActivity
क्लास में, इवेंट लिसनर ऑब्जेक्ट का रेफ़रंस देने के लिए दो वैरिएबल का एलान करें:
private var arrivalListener: Navigator.ArrivalListener? = null
private var routeChangedListener: Navigator.RouteChangedListener? = null
- नेविगेटर शुरू होने पर, लिसनर सेट अप करने के लिए
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)
}
}
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 फ़ाइल में, ये बदलाव करें:
- नेविगेशन डेस्टिनेशन सेट करने और
placeId
पैरामीटर को स्वीकार करने वाला नयाnavigateToPlace()
तरीका जोड़ें.
/**
* 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()
तरीके का इस्तेमाल करके, उस प्लेस आईडी से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 स्थान आईडी खोजक सुविधा का इस्तेमाल करें या Places API कॉल से स्थान आईडी पाएं.
नेविगेशन को सिम्युलेट करने के लिए, उपयोगकर्ता की जगह की जानकारी को कोड में सेट किया जा सकता है या कनेक्ट किए गए डिवाइस से लिया जा सकता है. कोडलैब में यह माना जाएगा कि आपने यूनाइटेड किंगडम के लंदन की जगह को सिम्युलेट किया है.
- शुरू करने की जगह और जगह का आईडी सेव करने के लिए, अपनी
MainActivity
क्लास में साथी ऑब्जेक्ट जोड़ें. इस कोडलैब में, लंदन में शुरू होने वाली जगह और Trafalgar Square के प्लेस आईडी का इस्तेमाल किया जाएगा:
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. अपना कोड बनाना और चलाना
ऐप्लिकेशन को पहली बार इस्तेमाल करने पर, आपको उसे जगह की जानकारी की अनुमतियां देनी होंगी. साथ ही, नेविगेशन SDK टूल इस्तेमाल करने की शर्तों को स्वीकार करना होगा.
ध्यान दें: ऐप्लिकेशन को चलाने पर, setDestinations() मेथड को कॉल किया जाएगा. इस मेथड का इस्तेमाल करने पर, 1,000 डेस्टिनेशन के बाद शुल्क लिया जाएगा. ज़्यादा जानकारी के लिए इस्तेमाल और बिलिंग देखें.
जगह की जानकारी सेट करना
डिफ़ॉल्ट रूप से, एमुलेट किए गए डिवाइस की जगह की जानकारी, माउंटेन व्यू, कैलिफ़ोर्निया में मौजूद Google कैंपस पर सेट हो सकती है. ऐसा तब तक होता है, जब तक कि आपने कोड में जगह की जानकारी सेट नहीं की है या एमुलेटर प्रॉपर्टी डायलॉग का इस्तेमाल नहीं किया है.
अगर ऐसा है, तो हो सकता है कि ऐप्लिकेशन आपके कॉन्फ़िगर किए गए प्लेस आईडी (डिफ़ॉल्ट रूप से, सिडनी ऑपेरा हाउस, सिडनी, ऑस्ट्रेलिया) का रास्ता न ढूंढ पाए. इसकी जानकारी, "कोई रास्ता नहीं मिला" मैसेज के ज़रिए दी जाएगी. यह मैसेज, showToast()
तरीके से दिखेगा.
शुरुआत की जगह को हार्ड कोडिंग करना
कोड में कोई दूसरी जगह सेट करने के लिए, MainActivity.kt में navigateToPlace()
कॉल करने से पहले, अपने navigateToPlace()
तरीके में यह लाइन जोड़ें:
mNavigator?.simulator?.setUserLocation(startLocation)
अपनी पसंद की डिफ़ॉल्ट जगह पर एमुलेटर को शुरू करना
डिवाइस एम्युलेटर में कोई दूसरी जगह सेट करने के लिए, अगर एम्युलेटर पहले से नहीं चल रहा है, तो उसे शुरू करें. इसके बाद, "एक्सटेंडेड कंट्रोल" टूलटिप के साथ तीन बिंदु वाले मेन्यू पर क्लिक करें. इसके बाद खुलने वाले डायलॉग बॉक्स में, "जगह" के लिए मेन्यू विकल्प होता है.
उदाहरण के लिए, अगर डेस्टिनेशन के तौर पर, प्लेस आईडी ऑफ़ सिडनी ऑपरा हाउस का इस्तेमाल किया जा रहा है, तो सिडनी, ऑस्ट्रेलिया में कोई जगह चुनें. उदाहरण के लिए, "Bondi समुद्र तट" खोजें, कोई सुझाव चुनें, और "जगह सेव करें" पर क्लिक करें क्लिक करें. आपके पास "पॉइंट सेव करने" पर क्लिक करने का भी विकल्प है सेव की गई सूची में जगह की जानकारी जोड़ें, ताकि आने वाले समय में इस्तेमाल किया जा सके.
अगर आपने डेस्टिनेशन के तौर पर कोई दूसरा प्लेस आईडी सेट किया है, तो उसके आस-पास की कोई जगह चुनें, ताकि सिम्युलेट किया गया रास्ता ज़्यादा असरदार हो और डीबग करने में आसानी हो.
ऐप्लिकेशन रीस्टार्ट करें. इससे अब वह डेस्टिनेशन पर पहुंच जाएगा.
11. बधाई हो!
आपने यह कोडलैब पूरा कर लिया है. बहुत बढ़िया - आप अपने गंतव्य पर पहुंच गए हैं! कोडिंग करते रहें :-)
12. इसे और बेहतर बनाना
अगर आपको अपने ऐप्लिकेशन को और बेहतर बनाना है, तो इन विषयों पर गौर करें.
- नेविगेशन के ज़्यादा इवेंट के बारे में जानें. ड्राइवर के रास्ता बदलने या पहुंचने पर मैसेज दिखाने के लिए कोड जोड़ें.
- नेविगेशन इंटरफ़ेस को पसंद के मुताबिक बनाना.
- अगर आपको बड़ी चुनौती चाहिए, तो देखें कि क्या उपयोगकर्ता को डेस्टिनेशन सेट करने की अनुमति देने के लिए, आपके पास Places API प्लेस पिकर कंट्रोल जोड़ने का विकल्प है. हिंट: GitHub पर नेविगेशन SDK डेमो ऐप्लिकेशन में, लागू करने का सैंपल दिया गया है.
- Github पर मौजूद नेविगेशन SDK टूल के डेमो ऐप्लिकेशन में इस्तेमाल किए गए तरीके को अपनाकर, Navigator और GoogleMap ऑब्जेक्ट को अलग-अलग कॉल करने से जुड़ी संभावित समस्याओं से बचें. ऐप्लिकेशन के ज़्यादा जटिल मामलों में, हो सकता है कि आपका कोड चलने के दौरान, इन ऑब्जेक्ट को शुरू करने की प्रोसेस पूरी न हुई हो. सलाह: तुरंत लागू करने के लिए, MainActivity.kt फ़ाइल के आखिर में InitializedNavScope क्लास जोड़ी जा सकती है.