Android (Java) के लिए, अपना Current Place Picker बनाना

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

अपने उपयोगकर्ताओं को उनकी मौजूदा जगह की जानकारी का पता लगाने के लिए, जगहों की सूची दिखाने का तरीका जानें. इसके लिए, Google Maps Platform और Places SDK for Android का इस्तेमाल करें.

bd07a9ad2cb27a06.png

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

  • Java की बुनियादी जानकारी

आपको क्या करना होगा

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

आपको क्या बनाना है

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

git clone https://github.com/googlecodelabs/current-place-picker-android.git

अगर आपको इस कोडलैब को पूरा करते समय कोई समस्या (कोड में गड़बड़ियां, व्याकरण की गलतियां, शब्दों का सही इस्तेमाल न होना या कोई अन्य समस्या) आती है, तो कृपया कोडलैब के निचले बाएं कोने में मौजूद, गड़बड़ी की शिकायत करें लिंक के ज़रिए समस्या की शिकायत करें.

2. शुरू करें

इस कोडलैब को शुरू करने से पहले, आपको ये चीज़ें सेट अप करनी होंगी:

Android Studio

Android Studio को https://developer.android.com/studio से डाउनलोड करें.

अगर आपके पास पहले से ही Android Studio है, तो पक्का करें कि आपके पास इसका नया वर्शन हो. इसके लिए, Android Studio > अपडेट देखें... पर क्लिक करें.

1f36bae83b64e33.png

इस लैब को Android Studio 3.4 का इस्तेमाल करके लिखा गया था.

Android SDK

Android Studio में, एसडीके मैनेजर का इस्तेमाल करके अपने हिसाब से एसडीके टूल कॉन्फ़िगर किए जा सकते हैं. इस लैब में Android Q SDK का इस्तेमाल किया जाता है.

  1. Android Studio की वेलकम स्क्रीन पर, कॉन्फ़िगर करें > SDK मैनेजर पर क्लिक करें.

d3fa03c269ec231c.png

  1. अपनी पसंद के एसडीके का चेकबॉक्स चुनें. इसके बाद, लागू करें पर क्लिक करें.

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

884e0aa1314f70d.png

Google Play सेवाएं

SDK मैनेजर से, आपको Google Play services भी इंस्टॉल करनी होंगी.

  1. SDK टूल टैब पर क्लिक करें और Google Play सेवाएं चेकबॉक्स को चुनें.

अगर स्थिति अपडेट उपलब्ध है के तौर पर दिखती है, तो अपडेट करें.

ad6211fd78f3b629.png

3. एम्युलेटर तैयार करना

ऐप्लिकेशन को चलाने के लिए, अपने डिवाइस को कनेक्ट किया जा सकता है या Android Emulator का इस्तेमाल किया जा सकता है.

अगर आपको अपने डिवाइस का इस्तेमाल करना है, तो इस पेज के आखिर में दिए गए असली डिवाइस से जुड़े निर्देश: Google Play services को अपडेट करना पर जाएं.

इम्यूलेटर जोड़ना

  1. Android Studio की वेलकम स्क्रीन पर, कॉन्फ़िगर करें > AVD मैनेजर पर क्लिक करें.

5dd2d14c9c56d3f9.png

इससे Android Virtual Device Manager डायलॉग खुलता है.

  1. Create Virtual Device... पर क्लिक करें. इससे, उन डिवाइसों की सूची खुल जाएगी जिन्हें चुना जा सकता है.

2d44eada384f8b35.png

  1. Play Store कॉलम में, Play d5722488d80cd6be.png आइकॉन वाला कोई डिवाइस चुनें और आगे बढ़ें पर क्लिक करें.

e0248f1c6e85ab7c.png

आपको सिस्टम इमेज का एक सेट दिखेगा, जिसे इंस्टॉल किया जा सकता है. अगर Android 9.+ (Google Play) को टारगेट करने वाले Q के बगल में Download लिखा है, तो Download पर क्लिक करें.

316d0d1efabd9f24.png

  1. अपने वर्चुअल डिवाइस को नाम देने के लिए, आगे बढ़ें पर क्लिक करें. इसके बाद, पूरा करें पर क्लिक करें.

इसके बाद, आपको आपके वर्चुअल डिवाइस की सूची पर वापस ले जाया जाएगा.

  1. अपने नए डिवाइस के बगल में मौजूद, शुरू करें ba8adffe56d3b678.png पर क्लिक करें:

7605864ed27f77ea.png

कुछ ही देर में, एम्युलेटर खुल जाएगा.

एम्युलेटर के लिए निर्देश—Google Play services को अपडेट करना

  1. एम्युलेटर लॉन्च होने के बाद, दिखने वाले नेविगेशन बार में ... पर क्लिक करें**.**

2e1156e02643d018.png

इससे ज़्यादा कंट्रोल डायलॉग बॉक्स खुलता है.

  1. मेन्यू में जाकर, Google Play पर क्लिक करें.

अगर कोई अपडेट उपलब्ध है, तो अपडेट करें पर क्लिक करें.

5afd2686c5cad0e5.png

  1. Google खाते से एम्युलेटर में साइन इन करें.

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

इसके बाद, Google Play services के लिए Google Play खुलता है.

  1. Google Play services का नया वर्शन पाने के लिए, अपडेट करें पर क्लिक करें.

f4bc067e80630b9c.png

अगर आपसे खाता सेटअप करने और पेमेंट का तरीका जोड़ने के लिए कहा जाता है, तो अभी नहीं पर क्लिक करें.

एम्युलेटर में जगह की जानकारी सेट करना

  1. इम्यूलेटर लॉन्च होने के बाद, Google Maps ऐप्लिकेशन का आइकॉन देखने के लिए, होम स्क्रीन पर मौजूद खोज बार में "maps" टाइप करें.

2d996aadd53685a6.png

  1. लॉन्च करने के लिए आइकॉन पर क्लिक करें.

आपको एक डिफ़ॉल्ट मैप दिखता है.

  1. मैप के सबसे नीचे दाईं ओर, आपकी जगह की जानकारी c5b4e2fda57a7e71.png पर क्लिक करें.

आपको फ़ोन की जगह की जानकारी का इस्तेमाल करने के लिए, फ़ोन को अनुमतियां देने के लिए कहा जाता है.

f2b68044eabca151.png

  1. एक्सटेंडेड कंट्रोल मेन्यू खोलने के लिए, ... पर क्लिक करें.
  2. स्थान टैब पर क्लिक करें.
  3. अक्षांश और देशांतर डालें.

यहां अपनी पसंद के हिसाब से कुछ भी डालें. हालांकि, पक्का करें कि वह जगह ऐसी हो जहां कई जगहें मौजूद हों.

(इस कोडलैब से मिले नतीजों को दोहराने के लिए, हवाई के मॉई में किहेई शहर के लिए अक्षांश 20.7818 और देशांतर -156.4624 का इस्तेमाल करें.)

  1. भेजें पर क्लिक करें. इसके बाद, मैप पर यह जगह अपडेट हो जाएगी.

f9576b35218f4187.png

अब आपके पास ऐप्लिकेशन को चलाने और जगह की जानकारी के साथ उसकी जांच करने का विकल्प है.

असली डिवाइस के लिए निर्देश—Google Play services को अपडेट करना

अगर किसी Android डिवाइस का इस्तेमाल किया जा रहा है, तो यह तरीका अपनाएं:

  1. होम स्क्रीन पर मौजूद खोज बार का इस्तेमाल करके, Google Play services खोजें और खोलें.
  2. ज़्यादा जानकारी पर क्लिक करें.

अगर कोई अपडेट उपलब्ध है, तो अपडेट करें पर क्लिक करें.

ad16cdb975b5c3f7.png baf0379ef8a9c88c.png

4. Google Maps गतिविधि के साथ ऐप्लिकेशन शेल बनाना

  1. Android Studio की वेलकम स्क्रीन पर, Start a new Android Studio project को चुनें.
  2. फ़ोन और टैबलेट टैब पर, Google Maps गतिविधि चुनें.

c9c80aa8211a8761.png

अपने प्रोजेक्ट को कॉन्फ़िगर करें डायलॉग बॉक्स खुलता है. यहां आपको अपने ऐप्लिकेशन का नाम डालना होता है. साथ ही, अपने डोमेन के आधार पर पैकेज बनाना होता है.

यहां Current Place नाम के ऐप्लिकेशन की सेटिंग दी गई हैं. यह com.google.codelab.currentplace पैकेज से जुड़ा है.

37f5b93b94ee118c.png

  1. भाषा के तौर पर Java चुनें और androidx. artifacts का इस्तेमाल करें* को चुनें.

बाकी सेटिंग के लिए डिफ़ॉल्ट वैल्यू का इस्तेमाल करें.

  1. पूरा करें पर क्लिक करें.

5. Gradle बिल्ड फ़ाइल में Google सेवाओं की डिपेंडेंसी जोड़ना

Android में जगह की जानकारी की अनुमतियां ऐक्सेस करने के लिए, आपको Google Play services से Google Location और Activity Recognition API की ज़रूरत होती है. इस और Google Play services के अन्य एपीआई को जोड़ने के बारे में ज़्यादा जानकारी के लिए, Google Play services सेट अप करना लेख पढ़ें.

Android Studio प्रोजेक्ट में आम तौर पर दो build.gradle फ़ाइलें होती हैं. एक फ़ाइल पूरे प्रोजेक्ट के लिए होती है और दूसरी ऐप्लिकेशन के लिए. अगर आपके पास Android Studio प्रोजेक्ट एक्सप्लोरर में Android व्यू है, तो आपको ये दोनों फ़ाइलें Gradle Scripts फ़ोल्डर में दिखेंगी. Google की सेवाएं जोड़ने के लिए, आपको build.gradle (Module: app) फ़ाइल में बदलाव करना होगा.

f3043429cf719c47.png

  1. जगह की जानकारी और Places API के लिए Google की सेवाएं जोड़ने के लिए, dependencies सेक्शन में दो लाइनें जोड़ें ( कॉन्टेक्स्ट में सैंपल कोड).

build.gradle (Module: app)

plugins {
  id 'com.android.application'
}

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.google.codelab.currentplace"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'com.google.android.gms:play-services-maps:16.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'

    implementation 'com.google.android.gms:play-services-location:16.0.0'
    implementation 'com.google.android.libraries.places:places:1.1.0'
}

6. Google Maps Platform API चालू करना और एपीआई पासकोड पाना

इसके बाद , आपको Android के लिए Maps SDK और Places API चालू करना होगा.

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

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

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

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

अभी बनाई गई एपीआई कुंजी को कॉपी करें. Android Studio पर वापस जाएं और Android > app > res > values में जाकर, google_maps_api.xml फ़ाइल ढूंढें.

YOUR_KEY_HERE को उस एपीआई पासकोड से बदलें जिसे आपने कॉपी किया है.

aa576e551a7a1009.png

आपका ऐप्लिकेशन अब कॉन्फ़िगर हो गया है.

7. लेआउट फ़ाइल में बदलाव करना

  1. प्रोजेक्ट एक्सप्लोरर में, Android > app > res > layout में मौजूद activity_maps.xml फ़ाइल खोलें.

4e0d986480c57efa.png

  1. आपको स्क्रीन के दाईं ओर बुनियादी यूज़र इंटरफ़ेस (यूआई) दिखेगा. साथ ही, सबसे नीचे टैब दिखेंगे. इनकी मदद से, अपने लेआउट के लिए डिज़ाइन या टेक्स्ट एडिटर चुना जा सकता है. टेक्स्ट चुनें. इसके बाद, लेआउट फ़ाइल के पूरे कॉन्टेंट को इससे बदलें:

activity_maps.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:orientation="vertical">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:minHeight="?attr/actionBarSize"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:titleTextColor="@android:color/white"
        android:background="@color/colorPrimary" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <fragment
            android:id="@+id/map"
            android:name="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="349dp"
            tools:context=".MapsActivity" />

        <ListView
            android:id="@+id/listPlaces"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

</LinearLayout>

इससे आपको ऐसा यूज़र इंटरफ़ेस मिलेगा:

1bf786808a4697ce.png

8. ऐप्लिकेशन बार सेट अप करना

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

3a17c92b613a26c5.png

फ़ोन पर, सिर्फ़ आइकॉन दिखता है. ज़्यादा जगह वाले टैबलेट पर, टेक्स्ट भी शामिल किया जाता है.

आइकॉन बनाना

  1. प्रोजेक्ट एक्सप्लोरर में, Android > app पर क्लिक करें. इसके बाद, res फ़ोल्डर पर राइट क्लिक करें और नया > इमेज ऐसेट को चुनें.

ऐसेट स्टूडियो खुल जाएगा.

  1. आइकॉन टाइप मेन्यू में, ऐक्शन बार और टैब आइकॉन पर क्लिक करें.
  2. अपनी ऐसेट को नाम दें ic_geolocate.
  3. ऐसेट टाइप के तौर पर क्लिप आर्ट चुनें**.**
  4. क्लिप आर्ट के बगल में मौजूद ग्राफ़िक पर क्लिक करें.

इससे आइकॉन चुनें विंडो खुलती है.

  1. एक आइकॉन चुनें.

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

  1. location खोजें और जगह से जुड़ा कोई आइकॉन चुनें.

मेरी जगह आइकॉन, Google Maps ऐप्लिकेशन में इस्तेमाल किए गए आइकॉन जैसा ही होता है. इसका इस्तेमाल तब किया जाता है, जब कोई उपयोगकर्ता कैमरे को अपनी मौजूदा जगह पर स्नैप करना चाहता है.

  1. ठीक है > अगला > खत्म करें पर क्लिक करें. इसके बाद,पुष्टि करें कि drawable नाम का एक नया फ़ोल्डर मौजूद है. इसमें आपके नए आइकॉन की फ़ाइलें मौजूद होंगी.

b9e0196137ed18ae.png

स्ट्रिंग रिसॉर्स जोड़ना

  1. प्रोजेक्ट एक्सप्लोरर में, Android > app > res > values पर क्लिक करें. इसके बाद, strings.xml फ़ाइल खोलें.
  2. <string name="title_activity_maps">Map</string> के बाद ये लाइनें जोड़ें:

strings.xml

    <string name="action_geolocate">Pick Place</string>
    <string name="default_info_title">Default Location</string>
    <string name="default_info_snippet">No places found, because location permission is disabled.</string>

पहली लाइन का इस्तेमाल आपके ऐप्लिकेशन बार में तब किया जाता है, जब आइकॉन के बगल में टेक्स्ट लेबल शामिल करने के लिए जगह होती है. अन्य कुकी का इस्तेमाल, मैप में जोड़े गए मार्कर के लिए किया जाता है.

अब फ़ाइल में मौजूद कोड ऐसा दिखता है:

<resources>
    <string name="app_name">Current Place</string>
    <string name="title_activity_maps">Map</string>
    <string name="action_geolocate">Pick Place</string>
    <string name="default_info_title">Default Location</string>
    <string name="default_info_snippet">No places found, because location permission is disabled.</string>
</resources>

ऐप्लिकेशन बार जोड़ना

  1. प्रोजेक्ट एक्सप्लोरर में, Android > app पर क्लिक करें. इसके बाद, res फ़ोल्डर पर राइट क्लिक करें और नया > डायरेक्ट्री को चुनें. इससे app/src/main/res के नीचे एक नई सबडायरेक्ट्री बन जाएगी.
  2. डायरेक्ट्री menu को नाम दें.
  3. menu फ़ोल्डर पर राइट क्लिक करें और नया > फ़ाइल चुनें.
  4. फ़ाइल को menu.xml नाम दें.
  5. इस कोड को चिपकाएं:
<?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">

    <!-- "Locate me", should appear as action button if possible -->
    <item
        android:id="@+id/action_geolocate"
        android:icon="@drawable/ic_geolocate"
        android:title="@string/action_geolocate"
        app:showAsAction="always|withText" />

</menu>

ऐप्लिकेशन बार का स्टाइल अपडेट करना

  1. प्रोजेक्ट एक्सप्लोरर में, Android > app > res > values को बड़ा करें. इसके बाद, styles.xml फ़ाइल खोलें.
  2. <style> टैग में, पैरंट प्रॉपर्टी को "Theme.AppCompat.NoActionBar" के तौर पर बदलें.
  3. name प्रॉपर्टी को नोट करें. इसका इस्तेमाल अगले चरण में किया जाएगा.

styles.xml

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">

AndroidManifest.xml में ऐप्लिकेशन की थीम अपडेट करें

  1. Android > app > manifests पर क्लिक करें. इसके बाद, AndroidManifest.xml फ़ाइल खोलें.
  2. android:theme लाइन ढूंढें और @style/AppTheme के लिए वैल्यू में बदलाव करें या पुष्टि करें.

AndroidManifest.xml

   <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

अब कोडिंग शुरू की जा सकती है!

9. ऐप्लिकेशन शुरू करना

  1. प्रोजेक्ट एक्सप्लोरर में जाकर, MapsActivity.java फ़ाइल ढूंढें.

यह उस फ़ोल्डर में होता है जो आपने पहले चरण में अपने ऐप्लिकेशन के लिए बनाया था.

8b0fa27d417f5f55.png

  1. फ़ाइल खोलें. इसके बाद, आपको Java कोड एडिटर दिखेगा.

Places SDK और अन्य डिपेंडेंसी इंपोर्ट करना

इन लाइनों को MapsActivity.java के सबसे ऊपर जोड़ें. साथ ही, इंपोर्ट करने के मौजूदा स्टेटमेंट बदलें.

इनमें मौजूदा इंपोर्ट शामिल हैं. साथ ही, इस कोडलैब में कोड में इस्तेमाल किए गए कई और इंपोर्ट भी शामिल हैं.

MapsActivity.java

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.android.libraries.places.api.Places;
import com.google.android.libraries.places.api.model.Place;
import com.google.android.libraries.places.api.model.PlaceLikelihood;
import com.google.android.libraries.places.api.net.FindCurrentPlaceRequest;
import com.google.android.libraries.places.api.net.FindCurrentPlaceResponse;
import com.google.android.libraries.places.api.net.PlacesClient;

import java.util.Arrays;
import java.util.List;

क्लास के हस्ताक्षर अपडेट करना

Places API, AndroidX कॉम्पोनेंट का इस्तेमाल करता है, ताकि पुराने वर्शन के साथ काम करने की सुविधा दी जा सके. इसलिए, AppCompatActivity को बढ़ाने के लिए आपको इसे तय करना होगा. यह FragmentActivity एक्सटेंशन की जगह लेता है, जिसे मैप से जुड़ी गतिविधि के लिए डिफ़ॉल्ट रूप से तय किया जाता है.

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback {

क्लास वैरिएबल जोड़ना

इसके बाद, अलग-अलग क्लास के तरीकों में इस्तेमाल किए गए अलग-अलग क्लास वैरिएबल के बारे में बताएं. इनमें यूज़र इंटरफ़ेस (यूआई) एलिमेंट और स्टेटस कोड शामिल हैं. ये GoogleMap mMap के लिए वैरिएबल के एलान के ठीक नीचे होने चाहिए.

    // New variables for Current Place picker
    private static final String TAG = "MapsActivity";
    ListView lstPlaces;
    private PlacesClient mPlacesClient;
    private FusedLocationProviderClient mFusedLocationProviderClient;

    // The geographical location where the device is currently located. That is, the last-known
    // location retrieved by the Fused Location Provider.
    private Location mLastKnownLocation;

    // A default location (Sydney, Australia) and default zoom to use when location permission is
    // not granted.
    private final LatLng mDefaultLocation = new LatLng(-33.8523341, 151.2106085);
    private static final int DEFAULT_ZOOM = 15;
    private static final int PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1;
    private boolean mLocationPermissionGranted;

    // Used for selecting the Current Place.
    private static final int M_MAX_ENTRIES = 5;
    private String[] mLikelyPlaceNames;
    private String[] mLikelyPlaceAddresses;
    private String[] mLikelyPlaceAttributions;
    private LatLng[] mLikelyPlaceLatLngs;

onCreate तरीके को अपडेट करना

आपको onCreate तरीके को अपडेट करना होगा. इससे जगह की जानकारी देने वाली सेवाओं के लिए, रनटाइम के दौरान उपयोगकर्ता की अनुमतियों को मैनेज किया जा सकेगा. साथ ही, यूज़र इंटरफ़ेस (यूआई) एलिमेंट सेट अप किए जा सकेंगे और Places API क्लाइंट बनाया जा सकेगा.

ऐक्शन टूलबार, व्यू सेटअप, और Places क्लाइंट के बारे में कोड की इन लाइनों को मौजूदा onCreate() तरीके के आखिर में जोड़ें.

MapsActivity.java onCreate()

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        //
        // PASTE THE LINES BELOW THIS COMMENT
        //
        
        // Set up the action toolbar
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        // Set up the views
        lstPlaces = (ListView) findViewById(R.id.listPlaces);

        // Initialize the Places client
        String apiKey = getString(R.string.google_maps_key);
        Places.initialize(getApplicationContext(), apiKey);
        mPlacesClient = Places.createClient(this);
        mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
    }

ऐप्लिकेशन बार मेन्यू के लिए कोड जोड़ना

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

onCreate तरीके के बाद, इन दोनों तरीकों को अपनी फ़ाइल में कॉपी करें.

MapsActivity.java onCreateOptionsMenu() और onOptionsItemSelected()

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
           case R.id.action_geolocate:
                
                // COMMENTED OUT UNTIL WE DEFINE THE METHOD
                // Present the current place picker
                // pickCurrentPlace();
                return true;

            default:
                // If we got here, the user's action was not recognized.
                // Invoke the superclass to handle it.
                return super.onOptionsItemSelected(item);

        }
    }

इसे आज़माएँ

  1. Android Studio में, Run या Run menu > Run ‘app' पर क्लिक करें.

28bea91c68c36fb2.png

  1. आपको डिप्लॉयमेंट का टारगेट चुनने के लिए कहा जाता है. इस सूची में, चालू एम्युलेटर दिखना चाहिए. इसे चुनें. इसके बाद, Android Studio आपके लिए ऐप्लिकेशन को एम्युलेटर पर डिप्लॉय कर देगा.

f44658ca91f6f41a.png

कुछ ही देर में ऐप्लिकेशन लॉन्च हो जाएगा. आपको ऑस्ट्रेलिया के सिडनी शहर का मैप दिखेगा. इसमें एक बटन और जगहों की खाली सूची होगी.

68eb8c70f4748350.png

जब तक डिवाइस की जगह की जानकारी का ऐक्सेस पाने के लिए अनुमति का अनुरोध नहीं किया जाता, तब तक मैप का फ़ोकस उपयोगकर्ता की जगह की जानकारी पर नहीं जाता.

10. जगह की जानकारी की अनुमतियों का अनुरोध करना और उन्हें मैनेज करना

मैप तैयार होने के बाद, जगह की जानकारी ऐक्सेस करने की अनुमतियों का अनुरोध करना

  1. उपयोगकर्ता की अनुमतियों का अनुरोध करने के लिए, getLocationPermission नाम का एक तरीका तय करें.

इस कोड को, अभी-अभी बनाए गए onOptionsSelected तरीके के नीचे चिपकाएं.

MapsActivity.java getLocationPermission()

    private void getLocationPermission() {
        /*
         * Request location permission, so that we can get the location of the
         * device. The result of the permission request is handled by a callback,
         * onRequestPermissionsResult.
         */
        mLocationPermissionGranted = false;
        if (ContextCompat.checkSelfPermission(this.getApplicationContext(),
                android.Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            mLocationPermissionGranted = true;
        } else {
            ActivityCompat.requestPermissions(this,
                    new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
                    PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
        }
    }
  1. ज़ूम कंट्रोल चालू करने और उपयोगकर्ता से जगह की जानकारी की अनुमतियों का अनुरोध करने के लिए, मौजूदा onMapReady तरीके के आखिर में दो लाइनें जोड़ें.

MapsActivity.java onMapReady()

   @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        // Add a marker in Sydney and move the camera
        LatLng sydney = new LatLng(-34, 151);
        mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));

        //
        // PASTE THE LINES BELOW THIS COMMENT
        //

        // Enable the zoom controls for the map
        mMap.getUiSettings().setZoomControlsEnabled(true);

        // Prompt the user for permission.
        getLocationPermission();

    }

अनुरोध की गई अनुमतियों से मिले नतीजे को मैनेज करना

जब उपयोगकर्ता, अनुमति के लिए अनुरोध करने वाले डायलॉग का जवाब देता है, तब Android इस कॉलबैक को कॉल करता है.

इस कोड को getLocationPermission() तरीके के बाद चिपकाएं:

MapsActivity.java onRequestPermissionsResult()

   /**
     * Handles the result of the request for location permissions
     */
    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           @NonNull String permissions[],
                                           @NonNull int[] grantResults) {
        mLocationPermissionGranted = false;
        switch (requestCode) {
            case PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    mLocationPermissionGranted = true;
                }
            }
        }
    }

11. मौजूदा जगह की जानकारी पाना और संभावित जगहों की जानकारी पाना

जब उपयोगकर्ता ऐप्लिकेशन बार में मौजूद जगह चुनें पर क्लिक करता है, तो ऐप्लिकेशन pickCurrentPlace() तरीके को कॉल करता है. यह तरीका, पहले से तय किए गए getDeviceLocation() तरीके को कॉल करता है. getDeviceLocation तरीका, डिवाइस की मौजूदा जगह की जानकारी पाने के बाद, getCurrentPlaceLikelihoods, तरीके को कॉल करता है.

findCurrentPlace API को कॉल करना और जवाब को मैनेज करना

getCurrentPlaceLikelihoods, findCurrentPlaceRequest बनाता है और Places API findCurrentPlace टास्क को कॉल करता है. अगर टास्क पूरा हो जाता है, तो यह findCurrentPlaceResponse दिखाता है. इसमें placeLikelihood ऑब्जेक्ट की सूची होती है. इनमें से हर एक की कई प्रॉपर्टी होती हैं. जैसे, जगह का नाम और पता. साथ ही, इस बात की संभावना भी होती है कि आप उस जगह पर हैं (0 से 1 तक की डबल वैल्यू). यह तरीका, placeLikelihoods से जगह की जानकारी की सूचियां बनाकर जवाब को मैनेज करता है.

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

इस कोड को onMapReady तरीके के बाद चिपकाएं.

MapsActivity.java getCurrentPlaceLikelihoods()

   private void getCurrentPlaceLikelihoods() {
        // Use fields to define the data types to return.
        List<Place.Field> placeFields = Arrays.asList(Place.Field.NAME, Place.Field.ADDRESS,
                Place.Field.LAT_LNG);

        // Get the likely places - that is, the businesses and other points of interest that
        // are the best match for the device's current location.
        @SuppressWarnings("MissingPermission") final FindCurrentPlaceRequest request =
                FindCurrentPlaceRequest.builder(placeFields).build();
        Task<FindCurrentPlaceResponse> placeResponse = mPlacesClient.findCurrentPlace(request);
        placeResponse.addOnCompleteListener(this,
                new OnCompleteListener<FindCurrentPlaceResponse>() {
                    @Override
                    public void onComplete(@NonNull Task<FindCurrentPlaceResponse> task) {
                        if (task.isSuccessful()) {
                            FindCurrentPlaceResponse response = task.getResult();
                            // Set the count, handling cases where less than 5 entries are returned.
                            int count;
                            if (response.getPlaceLikelihoods().size() < M_MAX_ENTRIES) {
                                count = response.getPlaceLikelihoods().size();
                            } else {
                                count = M_MAX_ENTRIES;
                            }

                            int i = 0;
                            mLikelyPlaceNames = new String[count];
                            mLikelyPlaceAddresses = new String[count];
                            mLikelyPlaceAttributions = new String[count];
                            mLikelyPlaceLatLngs = new LatLng[count];

                            for (PlaceLikelihood placeLikelihood : response.getPlaceLikelihoods()) {
                                Place currPlace = placeLikelihood.getPlace();
                                mLikelyPlaceNames[i] = currPlace.getName();
                                mLikelyPlaceAddresses[i] = currPlace.getAddress();
                                mLikelyPlaceAttributions[i] = (currPlace.getAttributions() == null) ?
                                        null : TextUtils.join(" ", currPlace.getAttributions());
                                mLikelyPlaceLatLngs[i] = currPlace.getLatLng();

                                String currLatLng = (mLikelyPlaceLatLngs[i] == null) ?
                                        "" : mLikelyPlaceLatLngs[i].toString();

                                Log.i(TAG, String.format("Place " + currPlace.getName()
                                        + " has likelihood: " + placeLikelihood.getLikelihood()
                                        + " at " + currLatLng));

                                i++;
                                if (i > (count - 1)) {
                                    break;
                                }
                            }


                            // COMMENTED OUT UNTIL WE DEFINE THE METHOD
                            // Populate the ListView
                            // fillPlacesList();
                        } else {
                            Exception exception = task.getException();
                            if (exception instanceof ApiException) {
                                ApiException apiException = (ApiException) exception;
                                Log.e(TAG, "Place not found: " + apiException.getStatusCode());
                            }
                        }
                    }
                });
    }

मैप कैमरे को डिवाइस की मौजूदा जगह की जानकारी पर ले जाएं

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

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

इस कोड को getPlaceLikelihoods() तरीके के बाद चिपकाएं:

MapsActivity.java getDeviceLocation()

    private void getDeviceLocation() {
        /*
         * Get the best and most recent location of the device, which may be null in rare
         * cases when a location is not available.
         */
        try {
            if (mLocationPermissionGranted) {
                Task<Location> locationResult = mFusedLocationProviderClient.getLastLocation();
                locationResult.addOnCompleteListener(this, new OnCompleteListener<Location>() {
                    @Override
                    public void onComplete(@NonNull Task<Location> task) {
                        if (task.isSuccessful()) {
                            // Set the map's camera position to the current location of the device.
                            mLastKnownLocation = task.getResult();
                            Log.d(TAG, "Latitude: " + mLastKnownLocation.getLatitude());
                            Log.d(TAG, "Longitude: " + mLastKnownLocation.getLongitude());
                            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(
                                    new LatLng(mLastKnownLocation.getLatitude(),
                                            mLastKnownLocation.getLongitude()), DEFAULT_ZOOM));
                        } else {
                            Log.d(TAG, "Current location is null. Using defaults.");
                            Log.e(TAG, "Exception: %s", task.getException());
                            mMap.moveCamera(CameraUpdateFactory
                                    .newLatLngZoom(mDefaultLocation, DEFAULT_ZOOM));
                        }

                       getCurrentPlaceLikelihoods();
                    }
                });
            }
        } catch (SecurityException e)  {
            Log.e("Exception: %s", e.getMessage());
        }
    }

जब उपयोगकर्ता 'जगह चुनें' पर क्लिक करे, तब जगह की जानकारी को ऐक्सेस करने की अनुमतियों की जांच करना

जब उपयोगकर्ता जगह चुनें पर टैप करता है, तो यह तरीका जगह की जानकारी ऐक्सेस करने की अनुमतियों की जांच करता है. अगर अनुमति नहीं दी गई है, तो उपयोगकर्ता को अनुमति देने के लिए कहा जाता है.

अगर उपयोगकर्ता ने अनुमति दी है, तो यह तरीका getDeviceLocation को कॉल करता है, ताकि मौजूदा जगहों की जानकारी पाने की प्रोसेस शुरू की जा सके.

  1. getDeviceLocation() के बाद यह तरीका जोड़ें:

MapsActivity.java pickCurrentPlace()

   private void pickCurrentPlace() {
        if (mMap == null) {
            return;
        }

        if (mLocationPermissionGranted) {
            getDeviceLocation();
        } else {
            // The user has not granted permission.
            Log.i(TAG, "The user did not grant location permission.");

            // Add a default marker, because the user hasn't selected a place.
            mMap.addMarker(new MarkerOptions()
                    .title(getString(R.string.default_info_title))
                    .position(mDefaultLocation)
                    .snippet(getString(R.string.default_info_snippet)));

            // Prompt the user for permission.
            getLocationPermission();
        }
    }
  1. pickCurrentPlace को तय करने के बाद, onOptionsItemSelected() में वह लाइन ढूंढें जो pickCurrentPlace को कॉल करती है. इसके बाद, उस लाइन से टिप्पणी हटाएं.

MapsActivity.java onOptionItemSelected()

           case R.id.action_geolocate:

                // COMMENTED OUT UNTIL WE DEFINE THE METHOD
                // Present the Current Place picker
                pickCurrentPlace();
                return true;

इसे आज़माएँ

अगर अब ऐप्लिकेशन चलाया जाता है और जगह चुनें पर टैप किया जाता है, तो उसे जगह की जानकारी की अनुमतियों के लिए प्रॉम्प्ट करना चाहिए.

  • अनुमति देने पर, आपकी प्राथमिकता सेव हो जाती है और आपको सूचना नहीं मिलती. अनुमति न देने पर, अगली बार बटन पर टैप करने पर आपको सूचना मिलेगी.
  • getPlaceLikelihoods ने मौजूदा जगहों की जानकारी फ़ेच कर ली है, लेकिन ListView में अब तक यह जानकारी नहीं दिख रही है. Android Studio में, ⌘6 पर क्लिक करके, MapsActivity के तौर पर टैग किए गए स्टेटमेंट के लिए, Logcat में लॉग देखे जा सकते हैं. इससे यह पुष्टि की जा सकती है कि आपके नए तरीके ठीक से काम कर रहे हैं.
  • अगर आपने अनुमति दी है, तो लॉग में Latitude: और Longitude: के लिए एक स्टेटमेंट शामिल होता है. इसमें डिवाइस की जगह की जानकारी दिखती है. अगर आपने पहले Google Maps और एम्युलेटर के एक्सटेंड किए गए मेन्यू का इस्तेमाल करके, एम्युलेटर के लिए जगह की जानकारी दी थी, तो इन स्टेटमेंट में वह जगह दिखेगी.
  • अगर findCurrentPlace को कॉल करने पर सही जवाब मिलता है, तो लॉग में पांच स्टेटमेंट शामिल होते हैं. इनमें, सबसे ज़्यादा संभावना वाली पांच जगहों के नाम और उनकी जगह की जानकारी प्रिंट होती है.

d9896a245b81bf3.png

12. Current Place पिकर में जानकारी भरना

चुनी गई जगहों के लिए हैंडलर सेट अप करना

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

इस क्लिक हैंडलर को pickCurrentPlace तरीके के बाद चिपकाएं.

MapsActivity.java listClickedHandler

    private AdapterView.OnItemClickListener listClickedHandler = new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView parent, View v, int position, long id) {
            // position will give us the index of which place was selected in the array
            LatLng markerLatLng = mLikelyPlaceLatLngs[position];
            String markerSnippet = mLikelyPlaceAddresses[position];
            if (mLikelyPlaceAttributions[position] != null) {
                markerSnippet = markerSnippet + "\n" + mLikelyPlaceAttributions[position];
            }

            // Add a marker for the selected place, with an info window
            // showing information about that place.
            mMap.addMarker(new MarkerOptions()
                    .title(mLikelyPlaceNames[position])
                    .position(markerLatLng)
                    .snippet(markerSnippet));

           // Position the map's camera at the location of the marker.
            mMap.moveCamera(CameraUpdateFactory.newLatLng(markerLatLng));
        }
    };

ListView को पॉप्युलेट करना

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

इस तरीके को क्लिक हैंडलर के बाद चिपकाएं:

MapsActivity.java fillPlacesList()

    private void fillPlacesList() {
        // Set up an ArrayAdapter to convert likely places into TextViews to populate the ListView
        ArrayAdapter<String> placesAdapter =
                new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mLikelyPlaceNames);
        lstPlaces.setAdapter(placesAdapter);
        lstPlaces.setOnItemClickListener(listClickedHandler);
    }

अब fillPlacesList को तय कर दिया गया है. इसलिए, findPlaceLikelihoods के आखिर में मौजूद उस लाइन को ढूंढें जो fillPlacesList को कॉल करती है. इसके बाद, उस लाइन से टिप्पणी हटाने के लिए, उसके आगे मौजूद # हटा दें.

MapsActivity.java fillPlaceLikelihoods()

               // COMMENTED OUT UNTIL WE DEFINE THE METHOD
                // Populate the ListView
                fillPlacesList();

मौजूदा जगह की जानकारी चुनने वाले टूल के लिए, बस इतना ही कोड ज़रूरी है!

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

कोई जगह चुनने की सुविधा को टेस्ट करना

  1. ऐप्लिकेशन को फिर से चलाएं.

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

  1. ListView में मौजूद किसी जगह के नाम पर क्लिक करें.

आपको मैप पर एक मार्कर दिखेगा.

  1. मार्कर पर टैप करें.

जगह की जानकारी देखी जा सकती है.

e52303cc0de6a513.png 864c74342fb52a01.png

किसी दूसरी जगह के लिए टेस्ट करना

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

इस समस्या को हल करने के लिए, एमुलेटर की जगह की जानकारी को अपडेट करने के लिए, नेटिव Google Maps ऐप्लिकेशन का इस्तेमाल करने के लिए यह तरीका अपनाएं:

  1. Google मानचित्र खोलें.
  2. अक्षांश और देशांतर को नए निर्देशांकों में बदलने के लिए, ... > जगह की जानकारी पर टैप करें. इसके बाद, भेजें पर टैप करें.
  3. उदाहरण के लिए, कनाडा के वैंकूवर शहर के बीचोंबीच की जगह की जानकारी सेट करने के लिए, अक्षांश: 49.2768 और देशांतर: -123.1142 का इस्तेमाल किया जा सकता है.
  4. पुष्टि करें कि Google Maps, आपके नए निर्देशांकों के हिसाब से फिर से सेंटर हो गया है. मैप को मौजूदा जगह पर वापस लाने का अनुरोध करने के लिए, आपको Google Maps ऐप्लिकेशन में मेरी जगह बटन पर टैप करना पड़ सकता है.
  5. Current Place ऐप्लिकेशन पर वापस जाएं और जगह चुनें पर टैप करें. इससे आपको नए कोऑर्डिनेट पर मैप दिखेगा. साथ ही, आपको मौजूदा जगहों की नई सूची दिखेगी.

9adb99d1ce25c184.png

यह बहुत आसान है! आपने एक ऐसा ऐप्लिकेशन बनाया है जो मौजूदा जगह के हिसाब से, आस-पास की जगहों की जानकारी देता है. साथ ही, यह भी बताता है कि आप इनमें से किन जगहों पर मौजूद हैं. आनंद लें!

अब आगे बढ़ें और इस बोनस चरण को पूरा करने के लिए, ऐप्लिकेशन को उन बदलावों के साथ चलाएं जो आपने किए हैं!

14. अगले चरण

अपनी एपीआई कुंजी को चोरी होने से बचाने के लिए, आपको उसे सुरक्षित रखना होगा. ऐसा करने पर, सिर्फ़ आपका Android ऐप्लिकेशन ही उस कुंजी का इस्तेमाल कर पाएगा. अगर एपीआई पासकोड पर पाबंदी नहीं लगाई जाती है, तो जिस व्यक्ति के पास आपका पासकोड होगा वह Google Maps Platform API को कॉल करने के लिए इसका इस्तेमाल कर सकता है. इससे आपको बिल मिल सकता है.

अपना SHA-1 सर्टिफ़िकेट पाना

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

Linux या macOS के लिए, टर्मिनल विंडो खोलें और यह डालें:

keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android

Windows Vista और Windows 7 के लिए, यह कमांड चलाएं:

keytool -list -v -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android

आपको इससे मिलता-जुलता आउटपुट दिखेगा:

Alias name: androiddebugkey
Creation date: Jan 01, 2013
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=Android Debug, O=Android, C=US
Issuer: CN=Android Debug, O=Android, C=US
Serial number: 4aa9b300
Valid from: Mon Jan 01 08:04:04 UTC 2013 until: Mon Jan 01 18:04:04 PST 2033
Certificate fingerprints:
     MD5:  AE:9F:95:D0:A6:86:89:BC:A8:70:BA:34:FF:6A:AC:F9
     SHA1: BB:0D:AC:74:D3:21:E1:43:07:71:9B:62:90:AF:A1:66:6E:44:5D:75
     Signature algorithm name: SHA1withRSA
     Version: 3

SHA1 से शुरू होने वाली लाइन में, सर्टिफ़िकेट का SHA-1 फ़िंगरप्रिंट होता है. फ़िंगरप्रिंट, कोलन से अलग किए गए दो अंकों वाले 20 हेक्साडेसिमल नंबर का क्रम होता है.

जब आपको कोई ऐप्लिकेशन रिलीज़ करना हो, तब इस दस्तावेज़ में दिए गए निर्देशों का इस्तेमाल करके, रिलीज़ सर्टिफ़िकेट पाएं.

अपनी एपीआई कुंजी पर पाबंदियां लगाना

  1. Cloud Console में, एपीआई और सेवाएं > क्रेडेंशियल पर जाएं.

आपने इस ऐप्लिकेशन के लिए जिस कुंजी का इस्तेमाल किया है वह एपीआई कुंजियों में शामिल होनी चाहिए.

  1. कुंजी की सेटिंग में बदलाव करने के लिए, 6454a04865d551e6.png पर क्लिक करें.

316b052c621ee91c.png

  1. एपीआई पासकोड वाले पेज पर, पासकोड से जुड़ी पाबंदियां के बाद, ऐप्लिकेशन से जुड़ी पाबंदियां सेट करें. इसके लिए, यह तरीका अपनाएं:
  2. Android ऐप्लिकेशन चुनें और निर्देशों का पालन करें.
  3. कोई आइटम जोड़ें पर क्लिक करें.
  4. अपना पैकेज नाम और SHA-1 सर्टिफ़िकेट फ़िंगरप्रिंट डालें. यह फ़िंगरप्रिंट, पिछले सेक्शन में मिला था.

उदाहरण के लिए:

com.google.codelab.currentplace
BB:0D:AC:74:D3:21:E1:43:07:71:9B:62:90:AF:A1:66:6E:44:5D:75s
  1. ज़्यादा सुरक्षा के लिए, एपीआई से जुड़ी पाबंदियां सेट करें. इसके लिए, यह तरीका अपनाएं.
  2. एपीआई से जुड़ी पाबंदियों के बाद, कुंजी को सीमित करें को चुनें.
  3. Android के लिए Maps SDK और Places API चुनें.
  4. हो गया और सेव करें पर क्लिक करें.

15. बधाई हो

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

ज़्यादा जानें