Android के लिए 'जगहें SDK टूल' (Kotlin) का इस्तेमाल शुरू करना

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

यह कोडलैब आपको बताता है कि 'जगह के SDK टूल' में Android के लिए 'ऐप्लिकेशन' ऐप्लिकेशन को कैसे जोड़ें. साथ ही, 'जगहें SDK टूल' की हर सुविधा का इस्तेमाल करें.

जगहों का डेमो ऐप्लिकेशन

ज़रूरी बातें

  • Kotlin और Android डेवलपमेंट की बुनियादी जानकारी

आप इन चीज़ों के बारे में जानेंगे

  • Kotlin एक्सटेंशन की मदद से, Android के लिए 'जगहें SDK टूल' को इंस्टॉल करने का तरीका.
  • किसी खास जगह के लिए जगह की जानकारी लोड करने का तरीका.
  • अपने ऐप्लिकेशन में 'जगह की जानकारी अपने-आप पूरा होना' विजेट जोड़ने का तरीका.
  • डिवाइस की मौजूदा जगह की जानकारी के हिसाब से, मौजूदा जगह की जानकारी लोड करने का तरीका.

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

इस कोडलैब को पूरा करने के लिए, आपको इन खातों, सेवाओं, और टूल की ज़रूरत होगी:

2. सेट अप करें

नीचे चालू करने का तरीका जानने के लिए, जगहों का एपीआई चालू करें.

Google Maps Platform सेट अप करना

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

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

  1. Google Cloud Marketplace में, इस कोडलैब के लिए ज़रूरी Google Maps Platform API और SDK टूल चालू करें. ऐसा करने के लिए, इस वीडियो या इस दस्तावेज़ में दिया गया तरीका अपनाएं.
  2. Cloud Console के क्रेडेंशियल पेज में एपीआई कुंजी जनरेट करें. आप इस वीडियो या इस दस्तावेज़ में दिया गया तरीका अपना सकते हैं. Google Maps Platform पर सभी अनुरोधों के लिए एपीआई कुंजी ज़रूरी है.

3. तुरंत शुरू करना

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

  1. अगर आपने git इंस्टॉल किया हुआ है, तो रिपॉज़िटरी क्लोन करें.
git clone https://github.com/googlemaps/codelab-places-101-android.git

इसके अलावा, स्रोत कोड डाउनलोड करने के लिए इस बटन पर क्लिक करें.

  1. कोड डाउनलोड करने के बाद, Android Studio में /starter डायरेक्ट्री में मिला प्रोजेक्ट खोलें. इस प्रोजेक्ट में वह बुनियादी फ़ाइल स्ट्रक्चर शामिल है जिसे आपको #39; कोडलैब (कोड बनाना सीखना) पूरा करना होगा. आपको जिस भी चीज़ के साथ काम करना है वह /starter निर्देशिका में मौजूद है.

अगर आप पूरा समाधान कोड देखना चाहते हैं, तो आप /solution डायरेक्ट्री में पूरा कोड देख सकते हैं.

4. Android के लिए स्थल SDK टूल इंस्टॉल करना

इस सेक्शन में, आप अपने ऐप्लिकेशन में Android के लिए 'जगहें SDK टूल' जोड़ें, यह आपकी डिपेंडेंसी पर निर्भर करता है.

अपनी एपीआई कुंजी जोड़ें

वह API (एपीआई) कुंजी दें जो आपने ऐप्लिकेशन में पहले बनाई थी, ताकि Android के लिए 'जगहें SDK टूल', आपकी कुंजी को आपके ऐप्लिकेशन से जोड़ सके.

  1. अपने प्रोजेक्ट की रूट डायरेक्ट्री में local.properties नाम की फ़ाइल खोलें (जिस लेवल पर gradle.properties और settings.gradle हैं).
  2. एक नई कुंजी परिभाषित करें, GOOGLE_MAPS_API_KEY, जिसमें उसका मान, आपकी बनाई गई API (एपीआई) कुंजी पर सेट किया जाए.

local.properties

GOOGLE_MAPS_API_KEY=YOUR_KEY_HERE

ध्यान दें कि local.properties, GIF डेटा स्टोर करने की जगह में .gitignore फ़ाइल की सूची में है. ऐसा इसलिए है, क्योंकि आपकी एपीआई कुंजी को संवेदनशील जानकारी माना जाता है. अगर हो सके, तो इसे सोर्स कंट्रोल में नहीं देखना चाहिए.

  1. इसके बाद, अपनी एपीआई कुंजी को बिना अनुमति के सार्वजनिक करें, ताकि वह आपके ऐप्लिकेशन में इस्तेमाल हो सके. अपने ऐप्लिकेशन में Android के लिए सीक्रेट Gradle प्लग इन app/ फ़ाइल में मौजूद build.gradle फ़ाइल शामिल करें, और plugins ब्लॉक में यह लाइन जोड़ें:

ऐप्लिकेशन-लेवल build.gradle

plugins {
    // ...
    id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
}
  1. अपने प्रोजेक्ट-लेवल की build.gradle फ़ाइल में बदलाव करें, ताकि इस क्लासपाथ को शामिल किया जा सके:

प्रोजेक्ट-लेवल build.gradle

buildscript {
    dependencies {
        // ...
        classpath "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.1"
    }
}

यह प्लग इन, आपकी local.properties फ़ाइल में तय किए गए 'की' को Android मेनिफ़ेस्ट फ़ाइल में बिल्ड वैरिएबल के तौर पर और बिल्ड के समय, Gradle से जनरेट की गई BuildConfig क्लास के वैरिएबल के तौर पर उपलब्ध कराता है. इस प्लग इन का इस्तेमाल करके, उन बॉयलरप्लेट कोड को हटा दिया जाता है जो local.properties से प्रॉपर्टी पढ़ने के लिए ज़रूरी होते, ताकि यह आपके पूरे ऐप्लिकेशन में ऐक्सेस किया जा सके.

Android डिपेंडेंसी के लिए जगहें SDK टूल जोड़ना

  1. अब आपकी एपीआई कुंजी को ऐप्लिकेशन में ऐक्सेस किया जा सकता है, इसलिए अपने ऐप्लिकेशन की build.gradle फ़ाइल में Android डिपेंडेंसी के लिए जगहें SDK टूल जोड़ें.

इस कोडलैब के साथ मिलने वाले स्टार्टर प्रोजेक्ट में, इस डिपेंडेंसी को आपके लिए पहले ही जोड़ा जा चुका है.

ऐप्लिकेशन-लेवल build.gradle

dependencies {
   // Dependency to include Places SDK for Android
   implementation 'com.google.android.libraries.places:places:2.6.0'
}
  1. ऐप्लिकेशन चलाएं.

अब आपको खाली स्क्रीन वाला ऐप्लिकेशन दिखेगा. इस स्क्रीन को तीन डेमो से पॉप्युलेट करना जारी रखें.

5. स्थल Android KTX इंस्टॉल करें

Kotlin ऐप्लिकेशन के एक या एक से ज़्यादा Google Maps Platform Android SDK टूल का इस्तेमाल करके, Kotlin एक्सटेंशन (KTX) लाइब्रेरी की मदद से, Kotlin लैंग्वेज की सुविधाओं का फ़ायदा लिया जा सकता है. जैसे कि कोरूटीन, एक्सटेंशन प्रॉपर्टी/फ़ंक्शन वगैरह. हर Google Maps SDK टूल में उससे जुड़ी एक KTX लाइब्रेरी मौजूद है, जैसा कि नीचे दिखाया गया है:

Google Maps Platform KTX डायग्राम

इस टास्क में, Kotlin ऐप्लिकेशन की लाइब्रेरी का इस्तेमाल करके, अपने ऐप्लिकेशन में Kotlin से जुड़ी खास सुविधाओं का इस्तेमाल करें.

जगहों के Android KTX डिपेंडेंसी जोड़ना

Kotlin की खास सुविधाओं का फ़ायदा पाने के लिए, अपनी ऐप्लिकेशन-लेवल build.gradle फ़ाइल में इस SDK टूल से जुड़ी KTX लाइब्रेरी शामिल करें.

build.gradle

dependencies {
    // ...

    // Places SDK for Android KTX Library
    implementation 'com.google.maps.android:places-ktx:2.0.0'
}

6. 'जगह का क्लाइंट' शुरू करें

ऐप्लिकेशन के दायरे के लिए 'जगहें SDK टूल' शुरू करें

app/src/main/java/com/google/codelabs/maps/placesdemo फ़ोल्डर की DemoApplication.kt फ़ाइल में, Android के लिए Places SDK टूल शुरू करें. onCreate फ़ंक्शन के आखिर में, नीचे दी गई लाइनें चिपकाएं:

        // Initialize the SDK with the Google Maps Platform API key
        Places.initialize(this, BuildConfig.GOOGLE_MAPS_API_KEY)

जब आप अपना ऐप्लिकेशन बनाते हैं, तो Android के लिए Secrets Gradle प्लग इन, local.properties फ़ाइल में, एपीआई कुंजी को BuildConfig.GOOGLE_MAPS_API_KEY के तौर पर उपलब्ध कराता है.

ऐप्लिकेशन फ़ाइल को मेनिफ़ेस्ट में जोड़ें

आपने Application को DemoApplication के साथ बढ़ाया है, इसलिए आपको मेनिफ़ेस्ट को अपडेट करना होगा. application फ़ाइल में android:name प्रॉपर्टी, AndroidManifest.xml फ़ाइल में जोड़ें, जो app/src/main में है:

    <application
        android:name=".DemoApplication"
        ...
    </application>

यह कोड ऐप्लिकेशन मेनिफ़ेस्ट को src/main/java/com/google/codelabs/maps/placesdemo/ फ़ोल्डर में DemoApplication क्लास के लिए पॉइंट करता है.

7. जगह की जानकारी पाएं

ज़्यादा जानकारी वाली स्क्रीन बनाएं

app/src/main/res/layout/ फ़ोल्डर में, खाली LinearLayout वाला activity_details.xml लेआउट उपलब्ध है. नीचे दिए गए कोड को <LinearLayout> ब्रैकेट के बीच जोड़कर, लीनियर लेआउट को पॉप्युलेट करें.

    <com.google.android.material.textfield.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/details_input"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/details_input_hint"
            android:text="@string/details_input_default" />

    </com.google.android.material.textfield.TextInputLayout>

    <Button
        android:id="@+id/details_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/button_details" />

    <TextView
        android:id="@+id/details_response_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="16dp"
        android:textIsSelectable="true" />

यह कोड एक टेक्स्ट इनपुट फ़ील्ड जोड़ता है जहां उपयोगकर्ता कोई भी प्लेस आईडी डाल सकता है या दिए गए डिफ़ॉल्ट आईडी का इस्तेमाल कर सकता है. जगह के ब्यौरे का अनुरोध शुरू करने के लिए एक बटन और जवाब से जानकारी दिखाने के लिए TextView का इस्तेमाल करता है. src/main/res/values/strings.xml फ़ाइल में, आपसे जुड़ी स्ट्रिंग तय होती हैं.

ब्यौरे वाली गतिविधि बनाना

  1. src/main/java/com/google/codelabs/maps/placesdemo/ फ़ोल्डर में DetailsActivity.kt फ़ाइल बनाएं और उसे उस लेआउट से जोड़ें जिसे आपने अभी-अभी बनाया है. इस कोड को फ़ाइल में चिपकाएं:
class DetailsActivity : AppCompatActivity() {
    private lateinit var placesClient: PlacesClient
    private lateinit var detailsButton: Button
    private lateinit var detailsInput: TextInputEditText
    private lateinit var responseView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_details)

        // Set up view objects
        detailsInput = findViewById(R.id.details_input)
        detailsButton = findViewById(R.id.details_button)
        responseView = findViewById(R.id.details_response_content)

    }
}
  1. इस गतिविधि के साथ इस्तेमाल करने के लिए 'जगहें क्लाइंट' बनाएं. onCreate फ़ंक्शन में व्यू ऑब्जेक्ट सेट अप होने के बाद, इस कोड को चिपकाएं.
        // Retrieve a PlacesClient (previously initialized - see DemoApplication)
        placesClient = Places.createClient(this)
  1. जगहें क्लाइंट सेट अप हो जाने के बाद, बटन पर क्लिक लिसनर अटैच करें. onCreate फ़ंक्शन में, Places क्लाइंट बनाने के बाद इस कोड को चिपकाएं.
        // Upon button click, fetch and display the Place Details
        detailsButton.setOnClickListener {
            val placeId = detailsInput.text.toString()
            val placeFields = listOf(
                Place.Field.NAME,
                Place.Field.ID,
                Place.Field.LAT_LNG,
                Place.Field.ADDRESS
            )
            lifecycleScope.launch {
                try {
                    val response = placesClient.awaitFetchPlace(placeId, placeFields)
                    responseView.text = response.prettyPrint()
                } catch (e: Exception) {
                    e.printStackTrace()
                    responseView.text = e.message
                }
            }
        }

यह कोड इनपुट फ़ील्ड में डाले गए स्थान आईडी को वापस लाता है, जगह के लिए अनुरोध करने वाले फ़ील्ड तय करता है, FetchPlaceRequest बनाता है, काम शुरू करता है, और सफल या असफलता की बात सुनता है. अगर अनुरोध कामयाब होता है, तो फ़ंक्शन TextView के साथ अनुरोध की गई जानकारी से पॉप्युलेट कर देता है.

  1. एक्सटेंशन फ़ंक्शन तय करके, उसे FetchPlaceResponse में बदलें. StringUtil.kt फ़ाइल को इसलिए बनाया गया है, ताकि स्पेस SDK टूल के जवाबों को आसानी से पढ़ी जा सकने वाली स्ट्रिंग में बदला जा सके.

DetailsActivity.kt फ़ाइल के आखिर में, FetchFetch रिस्पॉन्स ऑब्जेक्ट को स्ट्रिंग में बदलने के लिए फ़ंक्शन तय करें.

fun FetchPlaceResponse.prettyPrint(): String {
    return StringUtil.stringify(this, false)
}

मेनिफ़ेस्ट में ज़्यादा जानकारी वाली गतिविधि जोड़ें

app/src/main फ़ाइल में मौजूद AndroidManifest.xml फ़ाइल में, <application> एलिमेंट के चाइल्ड के तौर पर <activity> एलिमेंट जोड़ें:

        <activity android:name=".DetailsActivity" />

डेमो मेन्यू में ज़्यादा जानकारी वाली गतिविधि जोड़ें

होम स्क्रीन पर उपलब्ध डेमो की सूची बनाने के लिए, एक खाली Demo मॉड्यूल दिया जाता है. अब जब आपने स्थान विवरण गतिविधि बना ली है, तो उसे इस कोड के साथ src/main/java/com/google/codelabs/maps/placesdemo/ फ़ोल्डर में Demo.kt फ़ाइल में जोड़ें:

    DETAILS_FRAGMENT_DEMO(
        R.string.details_demo_title,
        R.string.details_demo_description,
        DetailsActivity::class.java
    ),

इससे जुड़ी स्ट्रिंग, src/main/res/values/strings.xml फ़ाइल में बताई जाती हैं.

MainActivity.kt की जांच करें और देखें कि यह ऐसा ViewView बनाता है जो Demo मॉड्यूल के कॉन्टेंट से दोहराया जाता है. अगर उपयोगकर्ता, सूची में किसी आइटम पर टैप करता है, तो क्लिक लिसनर उससे जुड़ी गतिविधि खोलता है.

ऐप्लिकेशन चलाएं

  1. ऐप्लिकेशन चलाएं. इस समय, आपको जगह की जानकारी का डेमो देने वाली सूची में एक आइटम दिखेगा.
  2. जगह की जानकारी वाले टेक्स्ट पर टैप करें. आपने जो व्यू बनाया है वह आपको इनपुट फ़ील्ड और बटन के साथ दिखेगा.
  3. &कोटेशन की जानकारी पाएं{0} बटन पर टैप करें. अगर आपने डिफ़ॉल्ट जगह का आईडी इस्तेमाल किया है, तो आपको जगह का नाम, पता, और मैप के निर्देशांक दिखेंगे, जैसा कि इमेज 1 में दिखाया गया है.

जवाब के साथ जगह की जानकारी वाली गतिविधि

पहला डायग्राम. जवाब के साथ जगह की जानकारी वाली गतिविधि दिखाई गई.

8. स्थान अपने आप पूरा करें

ऑटोकंप्लीट वाली स्क्रीन बनाएं

app/src/main/res/layout/ फ़ोल्डर में, खाली LinearLayout वाला activity_autocomplete.xml लेआउट दिया गया है. इस कोड को <LinearLayout> ब्रैकेट के बीच जोड़कर लीनियर लेआउट को पॉप्युलेट करें.

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/autocomplete_fragment"
        android:background="@android:color/white"
        android:name="com.google.android.libraries.places.widget.AutocompleteSupportFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/autocomplete_response_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="16dp"
        android:textIsSelectable="true" />

यह कोड रिस्पॉन्स से जानकारी दिखाने के लिए, AutocompleteSupportFragment विजेट और TextView जोड़ता है. इससे जुड़ी स्ट्रिंग, src/main/res/values/strings.xml फ़ाइल में बताई जाती हैं.

अपने-आप पूरा होने वाली गतिविधि बनाएं

  1. src/main/java/com/google/codelabs/maps/placesdemo/ फ़ोल्डर में AutocompleteActivity.kt फ़ाइल बनाएं और इसे इस कोड की मदद से तय करें:
class AutocompleteActivity : AppCompatActivity() {
    private lateinit var responseView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_autocomplete)

        // Set up view objects
        responseView = findViewById(R.id.autocomplete_response_content)
        val autocompleteFragment =
            supportFragmentManager.findFragmentById(R.id.autocomplete_fragment)
                    as AutocompleteSupportFragment
    }
}

यह कोड, गतिविधि को उन व्यू और AutocompleteSupportFramgent से जोड़ता है जिन्हें आपने लेआउट फ़ाइल में तय किया है.

  1. इसके बाद, बताएं कि जब उपयोगकर्ता 'जगह की जानकारी अपने-आप पूरी होना' से मिले सुझावों में से किसी एक को चुनता है, तो क्या होता है. इस कोड को onCreate फ़ंक्शन के आखिर में जोड़ें:
        // Specify the types of place data to return.
        autocompleteFragment.setPlaceFields(listOf(Place.Field.NAME, Place.Field.ID, Place.Field.LAT_LNG, Place.Field.ADDRESS))

        // Listen to place selection events
        lifecycleScope.launchWhenCreated {
            autocompleteFragment.placeSelectionEvents().collect { event ->
                when (event) {
                    is PlaceSelectionSuccess -> {
                        val place = event.place
                        responseView.text = StringUtil.stringifyAutocompleteWidget(place, false)
                    }
                    is PlaceSelectionError -> Toast.makeText(
                        this@AutocompleteActivity,
                        "Failed to get place '${event.status.statusMessage}'",
                        Toast.LENGTH_SHORT
                    ).show()
                }
            }

यह कोड बताता है कि किसी जगह के लिए किन फ़ील्ड का अनुरोध करना है, जगह चुनने के लिए इवेंट सुनना है, और सफलता या असफल होने के बारे में पता चलता है. अगर अनुरोध पूरा होता है, तो फ़ंक्शन TextView से जगह की जानकारी अपने-आप भर देता है. ध्यान रखें कि जगह की जानकारी को अपने-आप पूरा करने की सुविधा से, 'जगह का ऑब्जेक्ट' मिलता है. 'जगह की जानकारी अपने-आप पूरा होना' विजेट का इस्तेमाल करते समय, जगह की जानकारी अलग से अनुरोध करने की ज़रूरत नहीं होती.

मेनिफ़ेस्ट में ऑटोकंप्लीट की सुविधा में जोड़ें

app/src/main फ़ाइल में मौजूद AndroidManifest.xml फ़ाइल में, <application> एलिमेंट के चाइल्ड के तौर पर <activity> एलिमेंट जोड़ें:

        <activity android:name=".AutocompleteActivity" />

डेमो मेन्यू में ऑटोकंप्लीट की सुविधा जोड़ें

पहले की तरह ही, Demo मॉड्यूल में मौजूद सूची में 'जगह की जानकारी अपने-आप पूरा होना' सुविधा को होम स्क्रीन पर जोड़ें. अब आपने स्थान ऑटोकंप्लीट गतिविधि बना ली है, इसलिए इसे src/main/java/com/google/codelabs/maps/placesdemo/ फ़ोल्डर में Demo.kt फ़ाइल में जोड़ें. इस कोड को DETAILS_FRAGMENT_DEMO आइटम के तुरंत बाद चिपकाएं:

    AUTOCOMPLETE_FRAGMENT_DEMO(
        R.string.autocomplete_fragment_demo_title,
        R.string.autocomplete_fragment_demo_description,
        AutocompleteActivity::class.java
    ),

इससे जुड़ी स्ट्रिंग, src/main/res/values/strings.xml फ़ाइल में बताई जाती हैं.

ऐप्लिकेशन चलाएं

  1. ऐप्लिकेशन चलाएं. इस बार आपको होम स्क्रीन सूची में दो आइटम दिखाई देंगे.
  2. 'जगह की जानकारी अपने-आप पूरा होना' वाली लाइन पर टैप करें. आपको स्थान ऑटोकंप्लीट इनपुट पॉप-अप दिखेगा, जैसा कि इमेज 2 में दिखाया गया है.
  3. किसी जगह का नाम लिखना शुरू करें. यह किसी संस्थान का नाम, पता या भौगोलिक इलाका हो सकता है. आपके टाइप करते ही सुझाव पेश किए जाने चाहिए.
  4. अनुमानों में से किसी एक को चुनें. सुझाव गायब हो जाने चाहिए और TextView में अब चुनी गई जगह के बारे में पूरी जानकारी दिखेगी, जैसा कि इमेज 3 में दिखाया गया है.

उपयोगकर्ता के इनपुट फ़ील्ड पर टैप करने के बाद, अपने-आप पूरा होने की गतिविधि

दूसरा डायग्राम. उपयोगकर्ता के इनपुट फ़ील्ड पर टैप करने के बाद, अपने-आप पूरा होने की गतिविधि.

उपयोगकर्ता के लिखने और चुनने के बाद, अपने-आप पूरी होने वाली गतिविधि;

तीसरा डायग्राम. उपयोगकर्ता के लिखने और चुनने के बाद, जगह की जानकारी दिखाने वाली अपने-आप पूरी होने वाली गतिविधि.

9. डिवाइस का मौजूदा स्थान डाउनलोड करें

मौजूदा जगह की स्क्रीन बनाना

app/src/main/res/layout/ फ़ोल्डर में, खाली LinearLayout वाला activity_current.xml लेआउट दिया गया है. नीचे दिए गए कोड को <LinearLayout> ब्रैकेट के बीच में जोड़कर, लीनियर लेआउट को पॉप्युलेट करें.

    <Button
        android:id="@+id/current_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/current_button" />

    <TextView
        android:id="@+id/current_response_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="16dp"
        android:scrollbars = "vertical"
        android:textIsSelectable="true" />

मौजूदा जगह की गतिविधि बनाएं

  1. src/main/java/com/google/codelabs/maps/placesdemo/ फ़ोल्डर में CurrentActivity.kt फ़ाइल बनाएं और इसे इस कोड की मदद से तय करें:
class CurrentPlaceActivity : AppCompatActivity() {
    private lateinit var placesClient: PlacesClient
    private lateinit var currentButton: Button
    private lateinit var responseView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_current)

        // Retrieve a PlacesClient (previously initialized - see DemoApplication)
        placesClient = Places.createClient(this)

        // Set view objects
        currentButton = findViewById(R.id.current_button)
        responseView = findViewById(R.id.current_response_content)


        // Set listener for initiating Current Place
        currentButton.setOnClickListener {
            checkPermissionThenFindCurrentPlace()
        }
    }
}

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

  1. जगह की जानकारी की अनुमति पाने के लिए, checkPermissionThenFindCurrentPlace() के बारे में बताएं. अगर अनुमति नहीं मिली है, तो अनुमति का अनुरोध करें. onCreate फ़ंक्शन के बाद यह कोड चिपकाएं.
    /**
     * Checks that the user has granted permission for fine or coarse location.
     * If granted, finds current Place.
     * If not yet granted, launches the permission request.
     * See https://developer.android.com/training/permissions/requesting
     */
    private fun checkPermissionThenFindCurrentPlace() {
        when {
            (ContextCompat.checkSelfPermission(
                this,
                ACCESS_FINE_LOCATION
            ) == PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(
                this,
                ACCESS_COARSE_LOCATION
            ) == PackageManager.PERMISSION_GRANTED) -> {
                // You can use the API that requires the permission.
                findCurrentPlace()
            }
            shouldShowRequestPermissionRationale(ACCESS_FINE_LOCATION)
            -> {
                Log.d(TAG, "Showing permission rationale dialog")
                // TODO: In an educational UI, explain to the user why your app requires this
                // permission for a specific feature to behave as expected. In this UI,
                // include a "cancel" or "no thanks" button that allows the user to
                // continue using your app without granting the permission.
            }
            else -> {
                // Ask for both the ACCESS_FINE_LOCATION and ACCESS_COARSE_LOCATION permissions.
                ActivityCompat.requestPermissions(
                    this,
                    arrayOf(
                        Manifest.permission.ACCESS_FINE_LOCATION,
                        Manifest.permission.ACCESS_COARSE_LOCATION
                    ),
                    PERMISSION_REQUEST_CODE
                )
            }
        }
    }

    companion object {
        private val TAG = "CurrentPlaceActivity"
        private const val PERMISSION_REQUEST_CODE = 9
    }
  1. जब checkPermissionThenFindCurrentPlace फ़ंक्शन की else ब्रांच requestPermissions को कॉल करती है, तो ऐप्लिकेशन उपयोगकर्ता को अनुमति का अनुरोध डायलॉग दिखाता है. अगर उपयोगकर्ता का डिवाइस Android 12 से पहले के ओएस पर चल रहा है, तो उपयोगकर्ता सिर्फ़ जगह की सटीक जानकारी दे सकता है. अगर उपयोगकर्ता Android 12 या उसके बाद वाले वर्शन पर चल रहे डिवाइस का इस्तेमाल करता है, तो उसे जगह की सटीक (सटीक) जगह के बजाय अनुमानित (सामान्य) जगह की जानकारी देने का विकल्प दिया जाएगा, जैसा कि इमेज 4 में दिखाया गया है.

Android 12 या उसके बाद वाले वर्शन पर चल रहे डिवाइस पर उपयोगकर्ता की अनुमति का अनुरोध करना

चौथा डायग्राम. Android 12 या उसके बाद के वर्शन वाले डिवाइस पर उपयोगकर्ता की अनुमति का अनुरोध करने से, जगह की सटीक या अनुमानित जानकारी देने का विकल्प मिलता है.

जब उपयोगकर्ता, सिस्टम अनुमतियों वाले डायलॉग का जवाब देता है, तब सिस्टम onRequestPermissionsResult के लागू होने पर आपके ऐप्लिकेशन को लागू करता है. सिस्टम, उपयोगकर्ता के जवाब को अनुमति का डायलॉग पास करता है. साथ ही, अनुरोध कोड भी होता है जिसे आप तय करते हैं. जगह की जानकारी से जुड़ी अनुमतियों के अनुरोध को मैनेज करने के लिए, onRequestPermissionResult को बदलें. इसके लिए, नीचे दिए गए कोड को checkPermissionThenFindCurrentPlace के नीचे चिपकाएं.

    @SuppressLint("MissingPermission")
    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<String>, grantResults: IntArray
    ) {
        if (requestCode != PERMISSION_REQUEST_CODE) {
            super.onRequestPermissionsResult(
                requestCode,
                permissions,
                grantResults
            )
            return
        } else if (permissions.toList().zip(grantResults.toList())
                .firstOrNull { (permission, grantResult) ->
                    grantResult == PackageManager.PERMISSION_GRANTED && (permission == ACCESS_FINE_LOCATION || permission == ACCESS_COARSE_LOCATION)
                } != null
        )
            // At least one location permission has been granted, so proceed with Find Current Place
            findCurrentPlace()
    }
  1. अनुमति मिलने के बाद, findCurrentPlace फ़ंक्शन चलेगा. onRequestPermissionsResult फ़ंक्शन के बाद, इस कोड के साथ फ़ंक्शन के बारे में बताएं.
    /**
     * Fetches a list of [PlaceLikelihood] instances that represent the Places the user is
     * most
     * likely to be at currently.
     */
    @RequiresPermission(anyOf = [ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION])
    private fun findCurrentPlace() {
        // Use fields to define the data types to return.
        val placeFields: List<Place.Field> =
            listOf(Place.Field.NAME, Place.Field.ID, Place.Field.ADDRESS, Place.Field.LAT_LNG)

        // Use the builder to create a FindCurrentPlaceRequest.
        val request: FindCurrentPlaceRequest = FindCurrentPlaceRequest.newInstance(placeFields)

        // Call findCurrentPlace and handle the response (first check that the user has granted permission).
        if (ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION) ==
            PackageManager.PERMISSION_GRANTED ||
            ContextCompat.checkSelfPermission(this, ACCESS_COARSE_LOCATION) ==
            PackageManager.PERMISSION_GRANTED
        ) {
            // Retrieve likely places based on the device's current location
            lifecycleScope.launch {
                try {
                    val response = placesClient.awaitFindCurrentPlace(placeFields)
                    responseView.text = response.prettyPrint()

                    // Enable scrolling on the long list of likely places
                    val movementMethod = ScrollingMovementMethod()
                    responseView.movementMethod = movementMethod
                } catch (e: Exception) {
                    e.printStackTrace()
                    responseView.text = e.message
                }
            }
        } else {
            Log.d(TAG, "LOCATION permission not granted")
            checkPermissionThenFindCurrentPlace()

        }
    }

यह कोड बताता है कि संभावित जगहों के लिए किन फ़ील्ड का अनुरोध करना है. साथ ही, यह FindCurrentPlaceRequest बनाता है और टास्क शुरू करता है. साथ ही, अनुरोध किए गए ब्यौरे से TextView को अपने-आप भरता है.

  1. एक्सटेंशन फ़ंक्शन तय करके, उसे FindCurrentPlaceResponse में बदलें. StringUtil.kt फ़ाइल को इसलिए बनाया गया है, ताकि स्पेस SDK टूल के जवाबों को आसानी से पढ़ी जा सकने वाली स्ट्रिंग में बदला जा सके.

CurrentPlaceActivity.kt फ़ाइल के आखिर में, मौजूदा जगह के रिस्पॉन्स ऑब्जेक्ट को स्ट्रिंग में बदलने के लिए, किसी फ़ंक्शन के बारे में बताएं.

fun FindCurrentPlaceResponse.prettyPrint(): String {
    return StringUtil.stringify(this, false)
}

मेनिफ़ेस्ट में मौजूदा जगह की गतिविधि जोड़ें

app/src/main फ़ाइल में मौजूद AndroidManifest.xml फ़ाइल में, <application> एलिमेंट के चाइल्ड के तौर पर <activity> एलिमेंट जोड़ें:

        <activity android:name=".CurrentPlaceActivity" />

डेमो मेन्यू में मौजूदा जगह की गतिविधि जोड़ें

पहले की तरह ही, Demo मॉड्यूल की सूची में मौजूदा जगह का डेमो जोड़कर उसे होम स्क्रीन पर जोड़ें. अब जब आपने एक वर्तमान स्थान गतिविधि बना ली है, तो उसे src/main/java/com/google/codelabs/maps/placesdemo/ फ़ोल्डर में Demo.kt फ़ाइल में जोड़ें. इस कोड को AUTOCOMPLETE_FRAGMENT_DEMO आइटम के तुरंत बाद चिपकाएं:

    CURRENT_FRAGMENT_DEMO(
        R.string.current_demo_title,
        R.string.current_demo_description,
        CurrentPlaceActivity::class.java
    ),

इससे जुड़ी स्ट्रिंग, src/main/res/values/strings.xml फ़ाइल में बताई जाती हैं.

ऐप्लिकेशन चलाएं

  1. ऐप्लिकेशन चलाएं. इस बार आपको होम स्क्रीन सूची में तीन आइटम दिखाई देंगे.
  2. 'मौजूदा जगह' की पंक्ति पर टैप करें. आपको स्क्रीन पर एक बटन दिखेगा.
  3. बटन पर टैप करें. अगर आपने पहले इस ऐप्लिकेशन को जगह की जानकारी ऐक्सेस करने की अनुमति नहीं दी है, तो अनुमति का अनुरोध पॉप-अप होना चाहिए.
  4. ऐप्लिकेशन को डिवाइस की जगह की जानकारी ऐक्सेस करने की अनुमति दें.
  5. बटन को फिर से टैप करें. इस समय, आस-पास की 20 जगहों की सूची और उनकी संभावनाएं दिखनी चाहिए, जैसा कि इमेज 5 में दिखाया गया है.

डिवाइस और रिपोर्ट की गई जगह के लिए, &#39;मौजूदा जगह&#39; के मिलते-जुलते नतीजे दिखाना

पांचवां डायग्राम. डिवाइस की रिपोर्ट की गई मौजूदा जगह के लिए, 'मौजूदा जगह' के मिलते-जुलते नतीजे दिखाना.

10. बधाई हो

आपने Android के लिए 'जगहें SDK टूल' का इस्तेमाल करके Android ऐप्लिकेशन बनाया.

आपने क्या सीखा

आगे क्या करना है?

  • बेहतर तरीके से काम करने के लिए, सैंपल और डेमो की android-places-demos GitHub रिपॉज़िटरी को एक्सप्लोर करें या फ़ोर्क करें.
  • Google Maps Platform की मदद से Android ऐप्लिकेशन बनाने के लिए, Kotlin कोडलैब के ज़्यादा कोड से जानकारी पाएं.
  • यहां दिए गए सवालों के जवाब देकर, ऐसा कॉन्टेंट बनाने में हमारी मदद करें जो आपके लिए सबसे ज़्यादा काम का हो:

आप कौनसे अन्य कोडलैब देखना चाहते हैं?

मैप पर डेटा विज़ुअलाइज़ेशन मेरे मैप की शैली को पसंद के मुताबिक बनाने के बारे में ज़्यादा जानें मैप में 3D इंटरैक्शन के लिए बनाना

आप जिस कोडलैब (कोड बनाना सीखना) को सूची में नहीं जोड़ना चाहते हैं? नई समस्या के लिए, यहां अनुरोध करें.