1. शुरू करने से पहले
Google Maps की मदद से ऐप्लिकेशन बनाने से, आपको अपने ऐप्लिकेशन में सैटलाइट से ली गई तस्वीरों, मैप के लिए बेहतरीन यूज़र इंटरफ़ेस (यूआई) कंट्रोल, जगह की जानकारी को ट्रैक करने, और जगह की जानकारी मार्कर की सुविधाएं मिलती हैं. अपने डेटासेट से जानकारी दिखाकर, स्टैंडर्ड Google Maps को बेहतर बनाया जा सकता है. इस जानकारी में मछली पकड़ने या चढ़ाई करने के लिए मशहूर जगहें शामिल हैं. इसमें ऐसे गेम भी बनाए जा सकते हैं जिनमें खिलाड़ी असली दुनिया को एक्सप्लोर करे. जैसे, ख़ज़ाने की खोज या ऑगमेंटेड रिएलिटी (एआर) वाले गेम.
इस लेसन में, वॉन्डर नाम का Google Maps ऐप्लिकेशन बनाया गया है. यह ऐप्लिकेशन, पसंद के मुताबिक बनाए गए मैप दिखाता है और उपयोगकर्ता की जगह की जानकारी दिखाता है.
ज़रूरी शर्तें
इनके बारे में जानकारी:
- एक सामान्य Android ऐप्लिकेशन बनाने और उसे Android Studio का इस्तेमाल करके चलाने का तरीका.
- स्ट्रिंग जैसे संसाधन बनाने और उन्हें मैनेज करने का तरीका.
- Android Studio का इस्तेमाल करके, कोड की रीफ़ैक्टरिंग और वैरिएबल का नाम बदलने का तरीका.
- उपयोगकर्ता के तौर पर Google Maps को इस्तेमाल करने का तरीका.
- रनटाइम की अनुमतियां सेट करने का तरीका.
आप इन चीज़ों के बारे में जानेंगे
- Google API कंसोल से API कुंजी पाने और अपने ऐप्लिकेशन के लिए कुंजी रजिस्टर करने का तरीका
- अपने ऐप्लिकेशन में Google Maps जोड़ने का तरीका
- अलग-अलग तरह के मैप दिखाने का तरीका
- Google Maps की स्टाइल तय करने का तरीका
- अपने मैप पर मार्कर जोड़ने का तरीका
- उपयोगकर्ता को लोकप्रिय जगह (पीओआई) पर मार्कर लगाने की सुविधा कैसे दें
- जगह की जानकारी ट्रैक करने की सुविधा चालू करने का तरीका
Wander
ऐप्लिकेशन बनाने का तरीका, जिसमें Google Maps एम्बेड किया गया है- अपने ऐप्लिकेशन के लिए पसंद के मुताबिक सुविधाएं बनाने का तरीका. जैसे, मार्कर और स्टाइलिंग
- अपने ऐप्लिकेशन में जगह की जानकारी ट्रैक करने की सुविधा चालू करने का तरीका
2. ऐप्लिकेशन की खास जानकारी
इस कोडलैब में, Wander
ऐप्लिकेशन बनाया जाता है, जो पसंद के मुताबिक स्टाइल के साथ Google मैप दिखाता है. Wander ऐप्लिकेशन आपको जगहों पर मार्कर लगाने, ओवरले जोड़ने, और रीयल टाइम में अपनी जगह देखने की सुविधा देता है.
3. टास्क: प्रोजेक्ट सेट अप करें और एपीआई पासकोड पाएं
Android के लिए Maps SDK टूल इस्तेमाल करने के लिए, एपीआई पासकोड ज़रूरी है. एपीआई पासकोड पाने के लिए, अपना प्रोजेक्ट एपीआई और सेवाओं वाला पेज. एपीआई पासकोड ऐसे डिजिटल सर्टिफ़िकेट से जुड़ा होता है जो ऐप्लिकेशन को उसके लेखक से लिंक करता है. डिजिटल सर्टिफ़िकेट का इस्तेमाल करने और अपने ऐप्लिकेशन पर हस्ताक्षर करने के बारे में ज़्यादा जानकारी के लिए, अपने ऐप्लिकेशन पर हस्ताक्षर करना देखें.
इस कोडलैब में, डीबग सर्टिफ़िकेट के लिए एपीआई पासकोड का इस्तेमाल किया जाता है. डीबग सर्टिफ़िकेट, डिज़ाइन के हिसाब से सुरक्षित नहीं है. इसके बारे में, डीबग बिल्ड पर हस्ताक्षर करना सेक्शन में बताया गया है. Android के लिए Maps SDK टूल का इस्तेमाल करने वाले पब्लिश किए गए Android ऐप्लिकेशन के लिए, दूसरी एपीआई पासकोड की ज़रूरत होती है: रिलीज़ सर्टिफ़िकेट के लिए कुंजी. रिलीज़ सर्टिफ़िकेट पाने के बारे में ज़्यादा जानकारी के लिए, एपीआई पासकोड पाएं देखें.
Android Studio में Google Maps पर की गई गतिविधि का टेंप्लेट शामिल है, जो मददगार टेंप्लेट कोड जनरेट करता है. टेंप्लेट कोड में google_maps_api.xml फ़ाइल शामिल होती है. इसमें एक लिंक होता है, जिससे एपीआई पासकोड हासिल करने की प्रोसेस आसान हो जाती है.
पहला चरण: मैप टेंप्लेट की मदद से वॉन्डर प्रोजेक्ट बनाना
- नया Android Studio प्रोजेक्ट बनाएं.
- Google Maps गतिविधि टेंप्लेट चुनें.
- प्रोजेक्ट को
Wander
नाम दें. - एपीआई लेवल के कम से कम लेवल को API 19 पर सेट करें. पक्का करें कि भाषा Kotlin हो.
- पूरा करें पर क्लिक करें.
- ऐप्लिकेशन बनाने के बाद, अपने प्रोजेक्ट और Android Studio से आपके लिए बनाई गई मैप से जुड़ी इन फ़ाइलों पर एक नज़र डालें:
google_maps_api.xml—इस कॉन्फ़िगरेशन फ़ाइल का इस्तेमाल, अपने एपीआई पासकोड को होल्ड करने के लिए किया जाता है. टेंप्लेट दो google_maps_api.xml फ़ाइलें जनरेट करता है: एक डीबग के लिए और दूसरी रिलीज़ के लिए. डीबग सर्टिफ़िकेट के लिए, एपीआई पासकोड की फ़ाइल src/debug/res/values में मौजूद होती है. रिलीज़ सर्टिफ़िकेट के लिए एपीआई पासकोड की फ़ाइल, src/release/res/values में मौजूद होती है. इस कोडलैब में, सिर्फ़ डीबग सर्टिफ़िकेट का इस्तेमाल किया जाता है.
activity_maps.xml—इस लेआउट फ़ाइल में एक फ़्रैगमेंट होता है, जो पूरी स्क्रीन पर मौजूद होता है. SupportMapFragment
क्लास, Fragment
क्लास की सब-क्लास है. SupportMapFragment
किसी ऐप्लिकेशन में मैप रखने का सबसे आसान तरीका है. यह एक रैपर होता है, जो मैप के व्यू के चारों ओर मौजूद होता है. इससे लाइफ़साइकल की ज़रूरी ज़रूरतों को अपने-आप पूरा किया जा सकता है.
किसी भी ViewGroup
में <fragment>
टैग का इस्तेमाल करके, लेआउट फ़ाइल में SupportMapFragment
को शामिल किया जा सकता है. इसके लिए, name
एट्रिब्यूट का इस्तेमाल भी किया जा सकता है.
android:name="com.google.android.gms.maps.SupportMapFragment"
MapsActivity.java—MapsActivity.java फ़ाइल, onCreate()
तरीके में SupportMapFragment
को इंस्टैंशिएट करती है और क्लास का इस्तेमाल करती है मैप सिस्टम और व्यू को अपने-आप शुरू करने के लिए, getMapAsync
()
. SupportMapFragment
वाली गतिविधि के लिए, OnMapReadyCallback
इंटरफ़ेस और उस इंटरफ़ेस के onMapReady()
तरीके को लागू करना ज़रूरी है. मैप लोड होने पर, onMapReady()
तरीके को कॉल किया जाता है.
दूसरा चरण: एपीआई पासकोड पाना
- google_maps_api.xml फ़ाइल का डीबग वर्शन खोलें.
- फ़ाइल में, लंबे यूआरएल वाली टिप्पणी ढूंढें. यूआरएल के पैरामीटर में आपके ऐप्लिकेशन के बारे में खास जानकारी शामिल होती है.
- यूआरएल को कॉपी करके किसी ब्राउज़र में चिपकाएं.
- एपीआई और एपीआई पर प्रोजेक्ट बनाने के लिए, एपीआई और सेवाओं वाला पेज. दिए गए यूआरएल में दिए गए पैरामीटर की वजह से, यह पेज Android के लिए Maps SDK टूल को अपने-आप चालू कर लेता है.
- एपीआई पासकोड बनाएं पर क्लिक करें.
- अगले पेज पर, एपीआई पासकोड सेक्शन पर जाएं और उस पासकोड पर क्लिक करें जिसे आपने अभी-अभी बनाया है.
- कुंजी का इस्तेमाल Android ऐप्लिकेशन तक सीमित करने के लिए, कुंजी पर पाबंदी लगाएं पर क्लिक करें और Android के लिए Maps SDK टूल चुनें.
- जनरेट की गई एपीआई पासकोड कॉपी करें. यह "
AIza"
से शुरू होता है. google_maps_api.xml
फ़ाइल में, कुंजी कोgoogle_maps_key
स्ट्रिंग में वहां चिपकाएं जहांYOUR_KEY_HERE
लिखा हो.- अपना ऐप्लिकेशन चलाएं. आपको अपनी गतिविधि में एम्बेड किया गया एक मैप दिखेगा, जिसमें सिडनी, ऑस्ट्रेलिया में मार्कर सेट किया गया होगा. (सिडनी मार्कर टेम्प्लेट का हिस्सा है और आप इसे बाद में बदल सकते हैं.)
तीसरा चरण: mMap का नाम बदलें
MapsActivity
में mMap
नाम का एक निजी lateinit
var
है, जो GoogleMap
टाइप का है. Kotlin में नाम रखने के कन्वेंशन फ़ॉलो करने के लिए, mMap
का नाम बदलकर map
करें.
MapsActivity
में,mMap
पर राइट क्लिक करें. इसके बाद, रिफ़ैक्टर पर क्लिक करें > नाम बदलें...
- वैरिएबल का नाम बदलकर
map
करें.
ध्यान दें कि onMapReady()
फ़ंक्शन में mMap
के सभी रेफ़रंस, map
में कैसे बदलते हैं.
4. टास्क: मैप के टाइप जोड़ें
Google Maps में कई तरह के मैप होते हैं: सामान्य, हाइब्रिड, सैटलाइट, इलाके, और "कोई नहीं" (किसी भी मैप के न होने के लिए).
सामान्य मैप | सैटलाइट मैप | हाइब्रिड मैप | इलाके का मैप |
हर तरह का मैप अलग-अलग तरह की जानकारी देता है. उदाहरण के लिए, कार में नेविगेशन के लिए मैप का इस्तेमाल करते समय, सड़कों के नाम देखना मददगार होता है. इससे, सामान्य विकल्प का इस्तेमाल किया जा सकता है. जब आप चढ़ाई कर रहे हों, तब इलाके के मैप से यह तय करने में मदद मिल सकती है कि सबसे ऊपर पहुंचने के लिए आपको और कितनी चढ़ाई करनी होगी.
इस टास्क में आपको:
- विकल्प मेन्यू के साथ एक ऐप्लिकेशन बार जोड़ें, ताकि उपयोगकर्ता मैप का टाइप बदल सकें.
- मैप पर शुरू की गई जगह को अपने घर की जगह पर ले जाएं.
- मार्कर के लिए सहायता जोड़ें. इससे मैप पर सिर्फ़ एक जगह दिखती है और उसमें एक लेबल शामिल हो सकता है.
मैप टाइप के लिए मेन्यू जोड़ें
इसमें एक ऐप्लिकेशन बार जोड़ा जाता है, जिसमें विकल्प मेन्यू होता है. इसकी मदद से, उपयोगकर्ता मैप का टाइप बदल सकते हैं.
- नई मेन्यू एक्सएमएल फ़ाइल बनाने के लिए, अपनी res डायरेक्ट्री पर राइट क्लिक करें और नई > चुनें Android संसाधन फ़ाइल.
- डायलॉग में, फ़ाइल को
map_options
नाम दें. - रिसॉर्स टाइप के लिए, मेन्यू चुनें.
- ठीक है पर क्लिक करें.
- मैप मेन्यू के विकल्प बनाने के लिए, कोड टैब में, नई फ़ाइल में कोड को नीचे दिए गए कोड से बदलें. "कोई भी नहीं" मैप प्रकार छोड़ दिया गया है क्योंकि "कोई नहीं" इसका कोई भी मैप मौजूद नहीं है. इस चरण की वजह से गड़बड़ी होती है, लेकिन आप अगले चरण में इसे ठीक कर लेते हैं.
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/normal_map"
android:title="@string/normal_map"
app:showAsAction="never" />
<item
android:id="@+id/hybrid_map"
android:title="@string/hybrid_map"
app:showAsAction="never" />
<item
android:id="@+id/satellite_map"
android:title="@string/satellite_map"
app:showAsAction="never" />
<item
android:id="@+id/terrain_map"
android:title="@string/terrain_map"
app:showAsAction="never" />
</menu>
strings.xml
में, गड़बड़ियों को ठीक करने के लिएtitle
एट्रिब्यूट के लिए संसाधन जोड़ें.
<resources>
...
<string name="normal_map">Normal Map</string>
<string name="hybrid_map">Hybrid Map</string>
<string name="satellite_map">Satellite Map</string>
<string name="terrain_map">Terrain Map</string>
<string name="lat_long_snippet">Lat: %1$.5f, Long: %2$.5f</string>
<string name="dropped_pin">Dropped Pin</string>
<string name="poi">poi</string>
</resources>
MapsActivity
में,onCreateOptionsMenu()
तरीके को बदलें औरmap_options
रिसॉर्स फ़ाइल से मेन्यू को बड़ा करें.
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
val inflater = menuInflater
inflater.inflate(R.menu.map_options, menu)
return true
}
MapsActivity.kt
में,onOptionsItemSelected()
तरीके को बदलें. उपयोगकर्ता के चुने गए विकल्प को दिखाने के लिए, मैप-टाइप कॉन्सटेंट का इस्तेमाल करके, मैप टाइप बदलें.
override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
// Change the map type based on the user's selection.
R.id.normal_map -> {
map.mapType = GoogleMap.MAP_TYPE_NORMAL
true
}
R.id.hybrid_map -> {
map.mapType = GoogleMap.MAP_TYPE_HYBRID
true
}
R.id.satellite_map -> {
map.mapType = GoogleMap.MAP_TYPE_SATELLITE
true
}
R.id.terrain_map -> {
map.mapType = GoogleMap.MAP_TYPE_TERRAIN
true
}
else -> super.onOptionsItemSelected(item)
}
- ऐप्लिकेशन चलाएं.
- मैप का टाइप बदलने के लिए, पर क्लिक करें. ध्यान दें कि अलग-अलग मोड में, मैप का लुक कैसे बदलता है.
5. टास्क: मार्कर जोड़ें
डिफ़ॉल्ट रूप से, onMapReady()
कॉलबैक में ऐसा कोड शामिल होता है जो ऑस्ट्रेलिया के सिडनी में एक मार्कर लगाता है, जहां Google Maps बनाया गया था. डिफ़ॉल्ट कॉलबैक, मैप को सिडनी में पैन करने के लिए भी ऐनिमेट करता है.
इस टास्क में, आपको मैप के कैमरे को अपने होम पर ले जाना होगा, अपने तय किए गए लेवल पर ज़ूम करना होगा, और वहां मार्कर रखना होगा.
पहला चरण: अपने घर पर ज़ूम करें और मार्कर जोड़ें
MapsActivity.kt
फ़ाइल में,onMapReady()
तरीका ढूंढें. इसमें मौजूद वह कोड हटाएं जो सिडनी में मार्कर लगाता है और कैमरे को दूसरी जगह ले जाता है. अब आपका तरीका कुछ ऐसा दिखना चाहिए.
override fun onMapReady(googleMap: GoogleMap) {
map = googleMap
}
- इन निर्देशों का पालन करके, अपने घर का अक्षांश और देशांतर पता करें.
- अक्षांश और देशांतर के लिए एक वैल्यू बनाएं और उनकी फ़्लोट वैल्यू डालें.
val latitude = 37.422160
val longitude = -122.084270
- एक नया
LatLng
ऑब्जेक्ट बनाएं, जिसका नामhomeLatLng
हो.homeLatLng
ऑब्जेक्ट में, अभी-अभी बनाई गई वैल्यू पास करें.
val homeLatLng = LatLng(latitude, longitude)
- मैप पर कितना ज़ूम इन होना है, यह तय करने के लिए
val
बनाएं. ज़ूम लेवल 15f का इस्तेमाल करें.
val zoomLevel = 15f
ज़ूम लेवल से यह कंट्रोल होता है कि मैप पर आपने कितना ज़ूम इन किया है. यहां दी गई सूची से आपको पता चलता है कि ज़ूम का हर लेवल किस लेवल की जानकारी दिखाता है:
1
: दुनिया5
: भूखंड/महाद्वीप10
: शहर15
: सड़कें20
: इमारतें
- कैमरे को
homeLatLng
पर ले जाने के लिए,map
ऑब्जेक्ट परmoveCamera()
फ़ंक्शन को कॉल करें औरCameraUpdateFactory.newLatLngZoom()
का इस्तेमाल करकेCameraUpdate
ऑब्जेक्ट को पास करें.homeLatLng
ऑब्जेक्ट औरzoomLevel
को पास करें.
map.moveCamera(CameraUpdateFactory.newLatLngZoom(homeLatLng, zoomLevel))
homeLatLng
पर मैप में एक मार्कर जोड़ें.
map.addMarker(MarkerOptions().position(homeLatLng))
आपका आखिरी तरीका कुछ ऐसा दिखना चाहिए:
override fun onMapReady(googleMap: GoogleMap) {
map = googleMap
//These coordinates represent the latitude and longitude of the Googleplex.
val latitude = 37.422160
val longitude = -122.084270
val zoomLevel = 15f
val homeLatLng = LatLng(latitude, longitude)
map.moveCamera(CameraUpdateFactory.newLatLngZoom(homeLatLng, zoomLevel))
map.addMarker(MarkerOptions().position(homeLatLng))
}
- अपना ऐप्लिकेशन चलाएं. मैप को आपके घर तक पैन करना चाहिए, मनचाहे लेवल पर ज़ूम करना चाहिए, और आपके घर पर मार्कर लगाना चाहिए.
दूसरा चरण: उपयोगकर्ताओं को देर तक क्लिक करके मार्कर जोड़ने की अनुमति देना
इस चरण में, जब कोई उपयोगकर्ता मैप पर किसी जगह को छूता है और उसे दबाकर रखता है, तब एक मार्कर जोड़ा जाता है.
MapsActivity
मेंsetMapLongClick()
नाम का एक मेथड स्टब बनाएं, जोGoogleMap
को आर्ग्युमेंट के तौर पर लेता है.- मैप ऑब्जेक्ट में
setOnMapLongClickListener
लिसनर अटैच करें.
private fun setMapLongClick(map:GoogleMap) {
map.setOnMapLongClickListener { }
}
setOnMapLongClickListener()
में,addMarker()
तरीके को कॉल करें. नएMarkerOptions
ऑब्जेक्ट को पास करें, जिसकी पोज़िशन पास की गईLatLng
पर सेट की गई है.
private fun setMapLongClick(map: GoogleMap) {
map.setOnMapLongClickListener { latLng ->
map.addMarker(
MarkerOptions()
.position(latLng)
)
}
}
onMapReady()
तरीके का इस्तेमाल करने के बाद,setMapLongClick()
कोmap
के साथ कॉल करें.
override fun onMapReady(googleMap: GoogleMap) {
...
setMapLongClick(map)
}
- अपना ऐप्लिकेशन चलाएं.
- किसी जगह पर मार्कर लगाने के लिए, मैप को दबाकर रखें.
- मार्कर पर टैप करें, ताकि वह स्क्रीन के बीच में आ जाए.
चरण 3: मार्कर के लिए जानकारी विंडो जोड़ें
इस चरण में, एक InfoWindow
जोड़ा जाता है, जो मार्कर टैप किए जाने पर मार्कर के निर्देशांक दिखाता है.
setMapLongClick()setOnMapLongClickListener()
में,snippet
के लिएval
बनाएं. शीर्षक के बाद दिखाया जाने वाला अतिरिक्त टेक्स्ट स्निपेट होता है. आपका स्निपेट किसी मार्कर का अक्षांश और देशांतर दिखाता है.
private fun setMapLongClick(map: GoogleMap) {
map.setOnMapLongClickListener { latLng ->
// A snippet is additional text that's displayed after the title.
val snippet = String.format(
Locale.getDefault(),
"Lat: %1$.5f, Long: %2$.5f",
latLng.latitude,
latLng.longitude
)
map.addMarker(
MarkerOptions()
.position(latLng)
)
}
}
addMarker()
में,R.string.
dropped_pin
स्ट्रिंग रिसॉर्स का इस्तेमाल करके, मार्कर केtitle
को 'शामिल किए गए पिन' पर सेट करें.- मार्कर के
snippet
कोsnippet
पर सेट करें.
पूरा हो चुका फ़ंक्शन ऐसा दिखता है:
private fun setMapLongClick(map: GoogleMap) {
map.setOnMapLongClickListener { latLng ->
// A Snippet is Additional text that's displayed below the title.
val snippet = String.format(
Locale.getDefault(),
"Lat: %1$.5f, Long: %2$.5f",
latLng.latitude,
latLng.longitude
)
map.addMarker(
MarkerOptions()
.position(latLng)
.title(getString(R.string.dropped_pin))
.snippet(snippet)
)
}
}
- अपना ऐप्लिकेशन चलाएं.
- जगह का मार्कर छोड़ने के लिए मैप को दबाकर रखें.
- जानकारी विंडो दिखाने के लिए मार्कर पर टैप करें.
चौथा चरण: पीओआई लिसनर जोड़ना
डिफ़ॉल्ट रूप से, मैप पर लोकप्रिय जगहें (पीओआई), उनसे जुड़े आइकॉन के साथ दिखती हैं. लोकप्रिय जगहों में पार्क, स्कूल, सरकारी इमारतें वगैरह शामिल हैं. जब मैप टाइप को normal
पर सेट किया जाता है, तो मैप पर कारोबार की लोकप्रिय जगहें भी दिखती हैं. कारोबार से जुड़ी लोकप्रिय जगहों में दुकानें, रेस्टोरेंट, और होटल जैसे कारोबार होते हैं.
इस चरण में, आप मैप में GoogleMap.OnPoiClickListener
जोड़ते हैं. जब कोई उपयोगकर्ता किसी लोकप्रिय जगह पर क्लिक करता है, तो यह क्लिक लिसनर मैप पर तुरंत एक मार्कर लगा देता है. क्लिक लिसनर एक जानकारी विंडो भी दिखाता है जिसमें POI का नाम होता है.
MapsActivity
मेंsetPoiClick()
नाम का एक मेथड स्टब बनाएं, जोGoogleMap
को आर्ग्युमेंट के तौर पर लेता है.setPoiClick()
तरीके में, पास-इनGoogleMap
परOnPoiClickListener
सेट करें.
private fun setPoiClick(map: GoogleMap) {
map.setOnPoiClickListener { poi ->
}
}
setOnPoiClickListener()
में, मार्कर के लिए एकval poiMarker
बनाएं .map.addMarker()
का इस्तेमाल करके, इसे एक मार्कर पर सेट करें.MarkerOptions
में, लोकप्रिय जगह के नाम के लिएtitle
सेट करें.
private fun setPoiClick(map: GoogleMap) {
map.setOnPoiClickListener { poi ->
val poiMarker = map.addMarker(
MarkerOptions()
.position(poi.latLng)
.title(poi.name)
)
}
}
- जानकारी विंडो को तुरंत दिखाने के लिए,
setOnPoiClickListener()
फ़ंक्शन में,poiMarker
परshowInfoWindow()
को कॉल करें.
poiMarker.showInfoWindow()
setPoiClick()
फ़ंक्शन के लिए आपका फ़ाइनल कोड ऐसा दिखना चाहिए.
private fun setPoiClick(map: GoogleMap) {
map.setOnPoiClickListener { poi ->
val poiMarker = map.addMarker(
MarkerOptions()
.position(poi.latLng)
.title(poi.name)
)
poiMarker.showInfoWindow()
}
}
onMapReady()
खत्म होने पर,setPoiClick()
को कॉल करें औरmap
पास करें.
override fun onMapReady(googleMap: GoogleMap) {
...
setPoiClick(map)
}
- अपना ऐप्लिकेशन चलाएं और कोई लोकप्रिय जगह ढूंढें, जैसे कि पार्क या कॉफ़ी शॉप.
- लोकप्रिय जगह पर मार्कर लगाने के लिए, उस पर टैप करें. इसके बाद, जानकारी वाली विंडो में लोकप्रिय जगह का नाम दिखाएं.
6. टास्क: अपने मैप को स्टाइल दें
आप Google Maps को कई तरीकों से पसंद के मुताबिक बना सकते हैं, ताकि आपके मैप को एक अनोखा लुक मिल सके.
उपलब्ध एक्सएमएल एट्रिब्यूट का इस्तेमाल करके, MapFragment
ऑब्जेक्ट को पसंद के मुताबिक बनाया जा सकता है, जैसा कि किसी दूसरे फ़्रैगमेंट को पसंद के मुताबिक किया जाता है. हालांकि, इस चरण में GoogleMap
ऑब्जेक्ट के लिए दिए गए तरीकों का इस्तेमाल करके, MapFragment
के कॉन्टेंट का लुक और स्टाइल पसंद के मुताबिक बनाया जाता है.
अपने मैप की स्टाइल पसंद के मुताबिक बनाने के लिए, एक JSON फ़ाइल जनरेट की जाती है. इससे पता चलता है कि मैप में सुविधाएं कैसे दिखती हैं. आपको इस JSON फ़ाइल को मैन्युअल तरीके से बनाने की ज़रूरत नहीं है. Google, Maps Platform स्टाइलिंग विज़र्ड उपलब्ध कराता है. इसकी मदद से, मैप को विज़ुअल तौर पर स्टाइल करने के बाद, आपके लिए JSON जनरेट किया जाता है. इस टास्क में, आपको पुराने रंग की थीम वाले मैप को स्टाइल देना होता है. इसका मतलब है कि मैप में पुराने रंग और रंगीन सड़कों को जोड़ा जाता है.
पहला चरण: अपने मैप के लिए स्टाइल बनाना
- अपने ब्राउज़र में https://mapstyle.withgoogle.com/ पर जाएं.
- स्टाइल बनाएं चुनें.
- रेट्रो चुनें.
- ज़्यादा विकल्प पर क्लिक करें.
- सड़क चुनें > भरें.
- सड़कों के रंग को अपने चुने हुए किसी भी रंग (जैसे कि गुलाबी) में बदलें.
- पूरा करें पर क्लिक करें.
- मिलने वाले डायलॉग बॉक्स से JSON कोड कॉपी करें. अगर आप चाहें, तो इसे सादे टेक्स्ट वाले नोट में छिपाएं, ताकि अगले चरण में उसका इस्तेमाल किया जा सके.
दूसरा चरण: अपने मैप में स्टाइल जोड़ना
- Android Studio में,
res
डायरेक्ट्री में जाकर एक रिसॉर्स डायरेक्ट्री बनाएं और उसेraw
नाम दें. JSON कोड जैसे,raw
डायरेक्ट्री रिसॉर्स का इस्तेमाल किया जाता है. res/raw
मेंmap_style.json
नाम की फ़ाइल बनाएं.- नई रिसॉर्स फ़ाइल में, सेव किया गया JSON कोड चिपकाएं.
MapsActivity
में,onCreate()
तरीके के ऊपर एकTAG
क्लास वैरिएबल बनाएं. इसका इस्तेमाल लॉगिंग के लिए किया जाता है.
private val TAG = MapsActivity::class.java.simpleName
- साथ ही,
MapsActivity
में, एकsetMapStyle()
फ़ंक्शन बनाएं, जोGoogleMap
में ले जाता हो. setMapStyle()
में,try{}
ब्लॉक जोड़ें.- स्टाइल की सफलता के लिए,
try{}
ब्लॉक में एकval success
बनाएं. (आप नीचे दिए गए कैच ब्लॉक को जोड़ते हैं.) try{}
ब्लॉक में, JSON स्टाइल को मैप पर सेट करें. इसके बाद,GoogleMap
ऑब्जेक्ट परsetMapStyle()
को कॉल करें.MapStyleOptions
ऑब्जेक्ट को पास करें, जो JSON फ़ाइल लोड करता हो.success
को नतीजा असाइन करें.setMapStyle()
वाला तरीका, बूलियन दिखाता है. इससे स्टाइलिंग फ़ाइल को पार्स करने और स्टाइल सेट करने की प्रोसेस पूरी होने की स्थिति का पता चलता है.
private fun setMapStyle(map: GoogleMap) {
try {
// Customize the styling of the base map using a JSON object defined
// in a raw resource file.
val success = map.setMapStyle(
MapStyleOptions.loadRawResourceStyle(
this,
R.raw.map_style
)
)
}
}
success
के लिए अगर स्टेटमेंट गलत हो, तो उसे जोड़ें. अगर स्टाइलिंग पूरी नहीं हो सकी, तो उस लॉग को प्रिंट करें जिसे पार्स नहीं किया जा सका.
private fun setMapStyle(map: GoogleMap) {
try {
...
if (!success) {
Log.e(TAG, "Style parsing failed.")
}
}
}
- स्टाइल फ़ाइल मौजूद न होने की स्थिति को मैनेज करने के लिए,
catch{}
ब्लॉक जोड़ें. अगरcatch
ब्लॉक में फ़ाइल लोड नहीं हो पा रही है, तोResources.NotFoundException
लगाएं.
private fun setMapStyle(map: GoogleMap) {
try {
...
} catch (e: Resources.NotFoundException) {
Log.e(TAG, "Can't find style. Error: ", e)
}
}
तैयार किया गया तरीका, नीचे दिए गए कोड स्निपेट की तरह दिखना चाहिए:
private fun setMapStyle(map: GoogleMap) {
try {
// Customize the styling of the base map using a JSON object defined
// in a raw resource file.
val success = map.setMapStyle(
MapStyleOptions.loadRawResourceStyle(
this,
R.raw.map_style
)
)
if (!success) {
Log.e(TAG, "Style parsing failed.")
}
} catch (e: Resources.NotFoundException) {
Log.e(TAG, "Can't find style. Error: ", e)
}
}
- आखिर में, अपने
GoogleMap
ऑब्जेक्ट में पास होने वालेonMapReady()
तरीके मेंsetMapStyle()
तरीके को कॉल करें.
override fun onMapReady(googleMap: GoogleMap) {
...
setMapStyle(map)
}
- अपना ऐप्लिकेशन चलाएं.
- मैप को
normal
मोड पर सेट करें. इससे नई स्टाइल, रेट्रो थीम और अपने चुने गए रंग की सड़कों के साथ दिखनी चाहिए.
चरण 3: अपने मार्कर की फ़ॉर्मैटिंग करना
आप मैप मार्कर को शैली में ढालकर अपने मैप को और भी मनमुताबिक बना सकते हैं. इस चरण में, डिफ़ॉल्ट लाल मार्कर को कुछ और बेहतर तरीके से बदला जाता है.
onMapLongClick()
तरीके में, डिफ़ॉल्ट मार्कर का इस्तेमाल करने के लिए कंस्ट्रक्टर केMarkerOptions()
में कोड की इस लाइन को जोड़ें, लेकिन कलर को बदलकर नीला करें.
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))
अब onMapLongClickListener()
ऐसा दिखेगा:
map.setOnMapLongClickListener { latLng ->
// A snippet is additional text that's displayed after the title.
val snippet = String.format(
Locale.getDefault(),
"Lat: %1$.5f, Long: %2$.5f",
latLng.latitude,
latLng.longitude
)
map.addMarker(
MarkerOptions()
.position(latLng)
.title(getString(R.string.dropped_pin))
.snippet(snippet)
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE))
)
}
- ऐप्लिकेशन चलाएं. देर तक क्लिक करने के बाद दिखने वाले मार्कर अब नीले रंग के किए जाएंगे. ध्यान दें कि लोकप्रिय जगह के मार्कर अब भी लाल हैं, क्योंकि आपने
onPoiClick()
तरीके में स्टाइल नहीं जोड़ा है.
7. टास्क: ओवरले जोड़ना
Google मैप के ऊपर ड्रॉइंग करके उसे पसंद के मुताबिक बनाया जा सकता है. यह तकनीक तब काम आती है, जब आपको किसी खास तरह की जगह को हाइलाइट करना हो. जैसे, मछली पकड़ने की लोकप्रिय जगहें.
- आकार: आप मैप में पॉलीलाइन, पॉलीगॉन, और सर्कल जोड़ सकते हैं.
GroundOverlay
ऑब्जेक्ट: ग्राउंड ओवरले, वह इमेज होती है जिसे मैप पर जोड़ा जाता है. मार्कर से अलग, ग्राउंड ओवरले स्क्रीन के बजाय पृथ्वी की सतह के मुताबिक होते हैं. मैप को घुमाने, झुकाने या ज़ूम करने से इमेज का ओरिएंटेशन बदल जाता है. ग्राउंड ओवरले तब काम आते हैं, जब आपको मैप पर किसी जगह की एक इमेज ठीक करनी हो.
चरण: ग्राउंड ओवरले जोड़ना
इस टास्क में, आपको अपने घर की जगह पर Android के आकार का ग्राउंड ओवरले जोड़ना होता है.
- यह Android इमेज डाउनलोड करें और अपने
res/drawable
फ़ोल्डर में सेव करें. (पक्का करें कि फ़ाइल का नामandroid.png
है.)
onMapReady()
में, कैमरे को घर की जगह पर ले जाने के लिए कॉल करने के बाद,GroundOverlayOptions
ऑब्जेक्ट बनाएं.- ऑब्जेक्ट को
androidOverlay
नाम वाले वैरिएबल पर असाइन करें.
val androidOverlay = GroundOverlayOptions()
- डाउनलोड किए गए इमेज संसाधन से
BitmapDescriptor
ऑब्जेक्ट बनाने के लिए,BitmapDescriptorFactory.fromResource()
तरीके का इस्तेमाल करें. - नतीजे के तौर पर मिले
BitmapDescriptor
ऑब्जेक्ट कोGroundOverlayOptions
ऑब्जेक्ट केimage()
तरीके में पास करें.
val androidOverlay = GroundOverlayOptions()
.image(BitmapDescriptorFactory.fromResource(R.drawable.android))
- अपनी पसंद के ओवरले की मीटर में चौड़ाई के लिए
float overlaySize
बनाएं. इस उदाहरण के लिए,100f
की चौड़ाई सही काम करती है.
position()
तरीके को कॉल करके, GroundOverlayOptions
ऑब्जेक्ट के लिए position
प्रॉपर्टी सेट करें. इसके बाद, homeLatLng
ऑब्जेक्ट और overlaySize
को पास करें.
val overlaySize = 100f
val androidOverlay = GroundOverlayOptions()
.image(BitmapDescriptorFactory.fromResource(R.drawable.android))
.position(homeLatLng, overlaySize)
GoogleMap
ऑब्जेक्ट परaddGroundOverlay()
को कॉल करें और अपनाGroundOverlayOptions
ऑब्जेक्ट पास करें.
map.addGroundOverlay(androidOverlay)
- ऐप्लिकेशन चलाएं.
- Android इमेज को ओवरले के तौर पर देखने के लिए,
zoomLevel
की वैल्यू को 18f में बदलें.
8. टास्क: जगह की जानकारी ट्रैक करने की सुविधा चालू करना
उपयोगकर्ता, अपनी मौजूदा जगह की जानकारी देखने के लिए अक्सर Google Maps का इस्तेमाल करते हैं. अपने मैप पर डिवाइस की जगह दिखाने के लिए, जगह की जानकारी के डेटा लेयर का इस्तेमाल किया जा सकता है.
जगह-डेटा लेयर की मदद से मैप में मेरी जगह का आइकॉन जुड़ जाता है.
जब उपयोगकर्ता बटन पर टैप करता है, तो मैप डिवाइस की जगह की जगह पर दिखने लगता है. अगर डिवाइस स्थिर है, तो जगह को नीले बिंदु के तौर पर दिखाया जाता है. वहीं, अगर डिवाइस हिल रहा है, तो जगह को नीले शेवरॉन के तौर पर दिखाया जाता है.
इस टास्क में, जगह की जानकारी का डेटा लेयर चालू किया जाता है.
चरण: जगह की जानकारी की अनुमतियों का अनुरोध करें
Google Maps में जगह की जानकारी ट्रैक करने की सुविधा चालू करने के लिए, एक लाइन का कोड डालना ज़रूरी है. हालांकि, आपको यह पक्का करना होगा कि उपयोगकर्ता ने जगह की जानकारी की अनुमतियां दी हैं (रनटाइम-अनुमति मॉडल का इस्तेमाल करके).
इस चरण में, जगह की जानकारी की अनुमतियों का अनुरोध किया जाता है और जगह की जानकारी ट्रैक करने की सुविधा चालू की जाती है.
AndroidManifest.xml
फ़ाइल में, पुष्टि करें किFINE_LOCATION
की अनुमति पहले से मौजूद है. Android Studio ने यह अनुमति तब शामिल की थी, जब आपने Google Maps टेंप्लेट चुना था.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
MapsActivity
में,REQUEST_LOCATION_PERMISSION
क्लास वैरिएबल बनाएं.
private val REQUEST_LOCATION_PERMISSION = 1
- अनुमतियां दी गई हैं या नहीं, यह देखने के लिए
MapsActivity
मेंisPermissionGranted()
नाम का एक तरीका बनाएं. इस तरीके में देखें कि उपयोगकर्ता ने अनुमति दी है या नहीं.
private fun isPermissionGranted() : Boolean {
return ContextCompat.checkSelfPermission(
this,
Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
}
- अपने ऐप्लिकेशन में जगह की जानकारी ट्रैक करने की सुविधा चालू करने के लिए,
MapsActivity
मेंenableMyLocation()
नाम का एक तरीका बनाएं. यह तरीका, न तो आर्ग्युमेंट होता है और न ही कोई वैल्यू दिखाता है. इसके अंदर,ACCESS_FINE_LOCATION
की अनुमति देखें. अगर अनुमति दी गई है, तो जगह की जानकारी की लेयर चालू करें. अगर आपको ऐसा नहीं करना है, तो अनुमति पाने के लिए अनुरोध करें.
private fun enableMyLocation() {
if (isPermissionGranted()) {
map.isMyLocationEnabled = true
}
else {
ActivityCompat.requestPermissions(
this,
arrayOf<String>(Manifest.permission.ACCESS_FINE_LOCATION),
REQUEST_LOCATION_PERMISSION
)
}
}
- जगह की जानकारी की लेयर चालू करने के लिए,
onMapReady()
कॉलबैक सेenableMyLocation()
को कॉल करें.
override fun onMapReady(googleMap: GoogleMap) {
...
enableMyLocation()
}
onRequestPermissionsResult()
तरीके को बदलें. देखें किrequestCode
,REQUEST_LOCATION_PERMISSION
के बराबर है या नहीं. अगर जानकारी मौजूद है, तो इसका मतलब है कि अनुमति दे दी गई है. अगर अनुमति दी जाती है, तो यह भी देखें किgrantResults
कलेक्शन के पहले स्लॉट मेंPackageManager.PERMISSION_GRANTED
मौजूद है या नहीं. अगर यह सही है, तोenableMyLocation()
पर कॉल करें.
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<String>,
grantResults: IntArray) {
if (requestCode == REQUEST_LOCATION_PERMISSION) {
if (grantResults.contains(PackageManager.PERMISSION_GRANTED)) {
enableMyLocation()
}
}
}
- अपना ऐप्लिकेशन चलाएं. डिवाइस की जगह की जानकारी के ऐक्सेस के लिए, एक डायलॉग बॉक्स दिखेगा. आगे बढ़ें और अनुमति दें.
मैप अब एक नीले बिंदु का इस्तेमाल करके डिवाइस की मौजूदा जगह दिखाता है. ध्यान दें कि उसमें जगह की जानकारी देने वाला बटन मौजूद है. अगर आप मैप को अपनी मौजूदा जगह से दूर ले जाते हैं और इस बटन पर क्लिक करते हैं, तो यह मैप को वापस डिवाइस की जगह पर सेट कर देता है.
9. समाधान कोड
खत्म हो चुके कोडलैब के लिए कोड डाउनलोड करें.
$ git clone https://github.com/googlecodelabs/android-kotlin-geo-maps
इसके अलावा, आपके पास रिपॉज़िटरी को ZIP फ़ाइल के तौर पर डाउनलोड करने, अनज़िप करने, और Android Studio में खोलने का विकल्प भी है.
10. खास जानकारी
बधाई हो! आपने Android Kotlin ऐप्लिकेशन में Google मैप जोड़ा है और उसे स्टाइल किया है.
11. ज़्यादा जानें
Android डेवलपर के दस्तावेज़:
- शुरू करें
- मार्कर के साथ मैप जोड़ना
- ऑब्जेक्ट मैप करें
- स्टाइल वाला मैप जोड़ना
- स्ट्रीट व्यू
- ग्राउंड ओवरले
रेफ़रंस के लिए दस्तावेज़:
12. अगला कोडलैब
इस कोर्स में अन्य कोडलैब के लिंक के लिए, Kotlin कोडलैब में बेहतर Android का लैंडिंग पेज देखें.