Android में Kotlin की मदद से जगह की जानकारी के अपडेट पाएं

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

Android 10 और 11 में, लोगों को यह कंट्रोल मिलता है कि उनके डिवाइस की जगह की जानकारी को ऐप्लिकेशन कब ऐक्सेस कर सकते हैं.

Android 11 पर चलने वाला कोई ऐप्लिकेशन, जब जगह की जानकारी का ऐक्सेस पाने का अनुरोध करता है, तो उपयोगकर्ताओं के पास ये चार विकल्प होते हैं:

  • हमेशा मंज़ूरी दें
  • सिर्फ़ ऐप्लिकेशन इस्तेमाल करते समय अनुमति दें (Android 10 में)
  • सिर्फ़ एक बार (Android 11 में)
  • अस्वीकार करें

Android 10

6a1029175b467c77.png

Android 11

73d8cc88c5877c25.png

इस कोडलैब में, आपको जगह की जानकारी के अपडेट पाने का तरीका बताया जाएगा. साथ ही, यह भी बताया जाएगा कि Android के किसी भी वर्शन, खास तौर पर Android 10 और 11 पर जगह की जानकारी की सुविधा कैसे काम करती है. कोड लैब के आखिर में, आपके पास एक ऐसा ऐप्लिकेशन होगा जो जगह की जानकारी के अपडेट पाने के लिए, मौजूदा सबसे सही तरीकों का पालन करता है.

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

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

  • Android में जगह की जानकारी के लिए सबसे सही तरीके अपनाएं.
  • फ़ोरग्राउंड में जगह की जानकारी ऐक्सेस करने की अनुमतियों को मैनेज करना. इसका मतलब है कि जब उपयोगकर्ता, आपके ऐप्लिकेशन को डिवाइस की जगह की जानकारी ऐक्सेस करने का अनुरोध करता है, तब आपके ऐप्लिकेशन का इस्तेमाल किया जा रहा हो.
  • मौजूदा ऐप्लिकेशन में बदलाव करके, जगह की जानकारी ऐक्सेस करने का अनुरोध करने की सुविधा जोड़ें. इसके लिए, जगह की जानकारी के लिए सदस्यता लेने और सदस्यता छोड़ने का कोड जोड़ें.
  • ऐप्लिकेशन में Android 10 और 11 के लिए सहायता जोड़ें. इसके लिए, फ़ोरग्राउंड में जगह की जानकारी ऐक्सेस करने या ऐप्लिकेशन इस्तेमाल करते समय जगह की जानकारी ऐक्सेस करने का लॉजिक जोड़ें.

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

  • कोड चलाने के लिए, Android Studio 3.4 या इसके बाद का वर्शन
  • Android 10 और 11 की डेवलपर झलक पर काम करने वाला कोई डिवाइस/इम्यूलेटर

2. शुरू करें

स्टार्टर प्रोजेक्ट रेपो का क्लोन बनाना

हमारा सुझाव है कि आप इस स्टार्टर प्रोजेक्ट का इस्तेमाल करें, ताकि आप जल्द से जल्द काम शुरू कर सकें. अगर आपने Git इंस्टॉल किया है, तो यह कमांड चलाएं:

 git clone https://github.com/android/codelab-while-in-use-location

सीधे GitHub पेज पर जाएं.

अगर आपके पास Git नहीं है, तो प्रोजेक्ट को ZIP फ़ाइल के तौर पर डाउनलोड किया जा सकता है:

प्रोजेक्ट इंपोर्ट करना

Android Studio खोलें. इसके बाद, वेलकम स्क्रीन पर "Open an existing Android Studio project" को चुनें और प्रोजेक्ट डायरेक्ट्री खोलें.

प्रोजेक्ट लोड होने के बाद, आपको यह सूचना भी दिख सकती है कि Git, आपके सभी लोकल बदलावों को ट्रैक नहीं कर रहा है. अनदेखा करें पर क्लिक करें. (Git रेपो में कोई भी बदलाव वापस नहीं भेजा जाएगा.)

अगर आप Android व्यू में हैं, तो आपको प्रोजेक्ट विंडो के ऊपरी-बाएं कोने में, नीचे दी गई इमेज जैसा कुछ दिखेगा. (अगर आप प्रोजेक्ट व्यू में हैं, तो आपको प्रोजेक्ट को बड़ा करके देखना होगा.)

fa825dae96c5dc18.png

यहां दो फ़ोल्डर (base और complete) हैं. हर फ़ोल्डर को "मॉड्यूल" कहा जाता है.

कृपया ध्यान दें कि Android Studio को पहली बार बैकग्राउंड में प्रोजेक्ट को कंपाइल करने में कुछ सेकंड लग सकते हैं. इस दौरान, आपको Android Studio में सबसे नीचे मौजूद स्टेटस बार में यह मैसेज दिखेगा:

c2273e7835c0841a.png

कोड में बदलाव करने से पहले, Android Studio के इंडेक्सिंग और प्रोजेक्ट बनाने की प्रोसेस पूरी होने का इंतज़ार करें. इससे Android Studio को सभी ज़रूरी कॉम्पोनेंट डाउनलोड करने की अनुमति मिल जाएगी.

अगर आपको क्या भाषा बदलने के लिए, पेज को फिर से लोड करना है? या इस तरह का कोई अन्य मैसेज दिखता है, तो हां को चुनें.

स्टार्टर प्रोजेक्ट के बारे में जानकारी

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

मुख्य कॉम्पोनेंट में ये शामिल हैं:

  • MainActivity—उपयोगकर्ता के लिए यूज़र इंटरफ़ेस (यूआई), ताकि वह ऐप्लिकेशन को डिवाइस की जगह की जानकारी ऐक्सेस करने की अनुमति दे सके
  • LocationService—ऐसी सेवा जो जगह की जानकारी में हुए बदलावों के लिए सदस्यता लेती है और सदस्यता छोड़ती है. साथ ही, अगर उपयोगकर्ता ऐप्लिकेशन की गतिविधि से दूर चला जाता है, तो यह खुद को फ़ोरग्राउंड सेवा के तौर पर प्रमोट करती है (सूचना के साथ). यहां जगह का कोड जोड़ें.
  • Util—यह Location क्लास के लिए एक्सटेंशन फ़ंक्शन जोड़ता है और SharedPreferences (सिंपलीफाइड डेटा लेयर) में जगह की जानकारी सेव करता है.

इम्यूलेटर सेटअप

Android Emulator सेट अप करने के बारे में जानकारी के लिए, एम्युलेटर पर ऐप्लिकेशन चलाना लेख पढ़ें.

स्टार्टर प्रोजेक्ट चलाना

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

  1. अपने Android डिवाइस को कंप्यूटर से कनेक्ट करें या एम्युलेटर शुरू करें. (पक्का करें कि डिवाइस में Android 10 या इसके बाद का वर्शन हो.)
  2. टूलबार में, ड्रॉप-डाउन सिलेक्टर से base कॉन्फ़िगरेशन चुनें और चलाएं पर क्लिक करें:

99600e9d44527ab.png

  1. आपके डिवाइस पर यह ऐप्लिकेशन दिखेगा:

99bf1dae46f99af3.png

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

3. जगह की जानकारी जोड़ना

कॉन्सेप्ट

इस कोडलैब का मकसद, आपको यह दिखाना है कि जगह की जानकारी के अपडेट कैसे पाए जाते हैं. साथ ही, यह Android 10 और Android 11 पर काम करता है.

हालांकि, कोडिंग शुरू करने से पहले, बुनियादी बातों को समझ लेना ज़रूरी है.

जगह की जानकारी ऐक्सेस करने के टाइप

आपको कोडलैब की शुरुआत में, जगह की जानकारी ऐक्सेस करने के चार अलग-अलग विकल्पों के बारे में बताया गया था. यहां उनका मतलब बताया गया है:

  • सिर्फ़ ऐप्लिकेशन इस्तेमाल करते समय अनुमति दें
  • ज़्यादातर ऐप्लिकेशन के लिए, इस विकल्प का इस्तेमाल करने का सुझाव दिया जाता है. इसे "इस्तेमाल के दौरान" या "सिर्फ़ फ़ोरग्राउंड" ऐक्सेस भी कहा जाता है. इस विकल्प को Android 10 में जोड़ा गया था. इससे डेवलपर को सिर्फ़ तब जगह की जानकारी मिलती है, जब ऐप्लिकेशन का इस्तेमाल किया जा रहा हो. किसी ऐप्लिकेशन को ऐक्टिव तब माना जाता है, जब इनमें से कोई एक बात सही हो:
  • कोई गतिविधि दिख रही है.
  • फ़ोरग्राउंड सेवा, बैकग्राउंड में जारी गतिविधि की सूचना के साथ चल रही है.
  • सिर्फ़ एक बार
  • इसे Android 11 में जोड़ा गया है. यह सिर्फ़ ऐप्लिकेशन इस्तेमाल करते समय अनुमति दें के जैसा ही है, लेकिन यह अनुमति कुछ समय के लिए ही दी जाती है. ज़्यादा जानकारी के लिए, एक बार की अनुमतियां लेख पढ़ें.
  • Deny
  • इस विकल्प से, जगह की जानकारी को ऐक्सेस करने से रोका जाता है.
  • हमेशा के लिए अनुमति दें
  • इस विकल्प से, जगह की जानकारी को हमेशा ऐक्सेस करने की अनुमति मिलती है. हालांकि, Android 10 और इसके बाद के वर्शन के लिए एक और अनुमति की ज़रूरत होती है. यह भी पक्का करें कि आपके पास इस्तेमाल का मान्य उदाहरण हो और आपने जगह की जानकारी से जुड़ी नीतियों का पालन किया हो. हम इस विकल्प को इस कोडलैब में शामिल नहीं करेंगे, क्योंकि इसका इस्तेमाल बहुत कम किया जाता है. हालांकि, अगर आपके पास इस्तेमाल का कोई मान्य उदाहरण है और आपको यह समझना है कि हर समय जगह की जानकारी को कैसे मैनेज किया जाए, तो LocationUpdatesBackgroundKotlin सैंपल देखें. इसमें बैकग्राउंड में जगह की जानकारी ऐक्सेस करने का तरीका भी शामिल है.

सेवाएँ, फ़ोरग्राउंड सेवाएँ, और बाइंडिंग

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

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

इस कोडलैब में सिर्फ़ जगह की जानकारी के अपडेट पाने पर फ़ोकस किया गया है. इसलिए, आपको ज़रूरी कोड ForegroundOnlyLocationService.kt क्लास में मिल सकता है. उस क्लास और MainActivity.kt को ब्राउज़ करके, यह देखा जा सकता है कि ये दोनों एक साथ कैसे काम करते हैं.

ज़्यादा जानकारी के लिए, सेवाओं की खास जानकारी और बाउंड सेवाओं की खास जानकारी देखें.

अनुमतियां

NETWORK_PROVIDER या GPS_PROVIDER से जगह की जानकारी के अपडेट पाने के लिए, आपको उपयोगकर्ता से अनुमति का अनुरोध करना होगा. इसके लिए, आपको अपनी Android मेनिफ़ेस्ट फ़ाइल में, ACCESS_COARSE_LOCATION या ACCESS_FINE_LOCATION अनुमति का एलान करना होगा. इन अनुमतियों के बिना, आपका ऐप्लिकेशन रनटाइम के दौरान जगह की जानकारी को ऐक्सेस करने का अनुरोध नहीं कर पाएगा.

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

जगह की जानकारी

आपका ऐप्लिकेशन, com.google.android.gms.location पैकेज में मौजूद क्लास के ज़रिए, जगह की जानकारी देने वाली सेवाओं के सेट को ऐक्सेस कर सकता है.

मुख्य क्लास देखें:

  • FusedLocationProviderClient
  • यह लोकेशन फ़्रेमवर्क का मुख्य कॉम्पोनेंट है. इसे बनाने के बाद, इसका इस्तेमाल जगह की जानकारी के अपडेट का अनुरोध करने और पिछली बार की जगह की जानकारी पाने के लिए किया जाता है.
  • LocationRequest
  • यह एक डेटा ऑब्जेक्ट है. इसमें अनुरोधों के लिए, सेवा की क्वालिटी के पैरामीटर शामिल होते हैं. जैसे, अपडेट के इंटरवल, प्राथमिकताएं, और सटीकता. जगह की जानकारी के अपडेट का अनुरोध करने पर, इसे FusedLocationProviderClient को पास किया जाता है.
  • LocationCallback
  • इस कुकी का इस्तेमाल, डिवाइस की जगह की जानकारी बदलने या जगह की जानकारी का पता न चलने पर सूचनाएं पाने के लिए किया जाता है. इसे LocationResult पास किया जाता है. यहां आपको Location मिलता है, जिसे अपने डेटाबेस में सेव किया जा सकता है.

अब आपको यह पता चल गया है कि आपको क्या करना है. इसलिए, कोड लिखना शुरू करें!

4. जगह की जानकारी जोड़ने की सुविधाएं

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

जगह की जानकारी के अपडेट पाने के लिए, आपके ऐप्लिकेशन में कोई गतिविधि दिखनी चाहिए या फ़ोरग्राउंड में कोई सेवा चलनी चाहिए (सूचना के साथ).

अनुमतियां

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

अनुमति से जुड़ी मुख्य बातें यहां दी गई हैं. इस हिस्से के लिए, कोई कार्रवाई करने की ज़रूरत नहीं है:

  1. बताएं कि AndroidManifest.xml में किस अनुमति का इस्तेमाल किया जाता है.
  2. जगह की जानकारी को ऐक्सेस करने से पहले, यह देखें कि उपयोगकर्ता ने आपके ऐप्लिकेशन को ऐसा करने की अनुमति दी है या नहीं. अगर आपके ऐप्लिकेशन को अब तक अनुमति नहीं मिली है, तो ऐक्सेस का अनुरोध करें.
  3. उपयोगकर्ता की अनुमति से जुड़े विकल्प को मैनेज करता है. (यह कोड MainActivity.kt में देखा जा सकता है.)

AndroidManifest.xml या MainActivity.kt में TODO: Step 1.0, Review Permissions खोजने पर, आपको अनुमतियों के लिए लिखा गया पूरा कोड दिखता है.

ज़्यादा जानकारी के लिए, अनुमतियों की खास जानकारी देखें.

अब कुछ जगह के कोड लिखना शुरू करें.

जगह की जानकारी के अपडेट के लिए ज़रूरी मुख्य वैरिएबल की समीक्षा करना

base मॉड्यूल में, TODO: Step 1.1, Review variables खोजें

ForegroundOnlyLocationService.kt फ़ाइल.

इस चरण में, आपको कुछ भी करने की ज़रूरत नहीं है. जगह की जानकारी के अपडेट पाने के लिए इस्तेमाल की जाने वाली मुख्य क्लास और वैरिएबल को समझने के लिए, आपको सिर्फ़ इस कोड ब्लॉक और टिप्पणियों की समीक्षा करनी होगी.

// TODO: Step 1.1, Review variables (no changes).
// FusedLocationProviderClient - Main class for receiving location updates.
private lateinit var fusedLocationProviderClient: FusedLocationProviderClient

// LocationRequest - Requirements for the location updates, i.e., how often you
// should receive updates, the priority, etc.
private lateinit var locationRequest: LocationRequest

// LocationCallback - Called when FusedLocationProviderClient has a new Location.
private lateinit var locationCallback: LocationCallback

// Used only for local storage of the last known location. Usually, this would be saved to your
// database, but because this is a simplified sample without a full database, we only need the
// last location to create a Notification if the user navigates away from the app.
private var currentLocation: Location? = null

FusedLocationProviderClient के शुरू होने की प्रोसेस की समीक्षा करना

base मॉड्यूल में, ForegroundOnlyLocationService.kt फ़ाइल में TODO: Step 1.2, Review the FusedLocationProviderClient खोजें. आपका कोड कुछ ऐसा दिखना चाहिए:

// TODO: Step 1.2, Review the FusedLocationProviderClient.
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)

पिछली टिप्पणियों में बताया गया है कि जगह की जानकारी के अपडेट पाने के लिए, यह मुख्य क्लास है. आपके लिए वैरिएबल पहले से ही शुरू किया गया है. हालांकि, यह समझना ज़रूरी है कि इसे कैसे शुरू किया गया है. इसके लिए, कोड की समीक्षा करें. जगह की जानकारी के अपडेट का अनुरोध करने के लिए, यहां बाद में कुछ कोड जोड़ा जाता है.

LocationRequest को शुरू करना

  1. base मॉड्यूल में, ForegroundOnlyLocationService.kt फ़ाइल में TODO: Step 1.3, Create a LocationRequest खोजें.
  2. टिप्पणी के बाद यह कोड जोड़ें.

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

// TODO: Step 1.3, Create a LocationRequest.
locationRequest = LocationRequest.create().apply {
   // Sets the desired interval for active location updates. This interval is inexact. You
   // may not receive updates at all if no location sources are available, or you may
   // receive them less frequently than requested. You may also receive updates more
   // frequently than requested if other applications are requesting location at a more
   // frequent interval.
   //
   // IMPORTANT NOTE: Apps running on Android 8.0 and higher devices (regardless of
   // targetSdkVersion) may receive updates less frequently than this interval when the app
   // is no longer in the foreground.
   interval = TimeUnit.SECONDS.toMillis(60)

   // Sets the fastest rate for active location updates. This interval is exact, and your
   // application will never receive updates more frequently than this value.
   fastestInterval = TimeUnit.SECONDS.toMillis(30)

   // Sets the maximum time when batched location updates are delivered. Updates may be
   // delivered sooner than this interval.
   maxWaitTime = TimeUnit.MINUTES.toMillis(2)

   priority = LocationRequest.PRIORITY_HIGH_ACCURACY
}
  1. टिप्पणियों को पढ़कर समझें कि हर टिप्पणी कैसे काम करती है.

LocationCallback को शुरू करना

  1. base मॉड्यूल में, ForegroundOnlyLocationService.kt फ़ाइल में TODO: Step 1.4, Initialize the LocationCallback खोजें.
  2. टिप्पणी के बाद यह कोड जोड़ें.
// TODO: Step 1.4, Initialize the LocationCallback.
locationCallback = object : LocationCallback() {
    override fun onLocationResult(locationResult: LocationResult) {
        super.onLocationResult(locationResult)

        // Normally, you want to save a new location to a database. We are simplifying
        // things a bit and just saving it as a local variable, as we only need it again
        // if a Notification is created (when the user navigates away from app).
        currentLocation = locationResult.lastLocation

        // Notify our Activity that a new location was added. Again, if this was a
        // production app, the Activity would be listening for changes to a database
        // with new locations, but we are simplifying things a bit to focus on just
        // learning the location side of things.
        val intent = Intent(ACTION_FOREGROUND_ONLY_LOCATION_BROADCAST)
        intent.putExtra(EXTRA_LOCATION, currentLocation)
        LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(intent)

        // Updates notification content if this service is running as a foreground
        // service.
        if (serviceRunningInForeground) {
            notificationManager.notify(
                NOTIFICATION_ID,
                generateNotification(currentLocation))
        }
    }
}

यहां बनाया गया LocationCallback, कॉलबैक होता है. जब भी नई जगह की जानकारी अपडेट होती है, तब FusedLocationProviderClient इस कॉलबैक को कॉल करेगा.

अपने कॉलबैक में, आपको सबसे पहले LocationResult ऑब्जेक्ट का इस्तेमाल करके, जगह की नई जानकारी मिलती है. इसके बाद, आपको Activity को नई जगह की सूचना देनी होगी. इसके लिए, लोकल ब्रॉडकास्ट का इस्तेमाल करें. हालांकि, ऐसा तब ही किया जा सकता है, जब यह सुविधा चालू हो. इसके अलावा, अगर यह सेवा फ़ोरग्राउंड Service के तौर पर चल रही है, तो Notification को अपडेट करें.

  1. टिप्पणियों को पढ़कर समझें कि हर हिस्से का क्या काम है.

जगह की जानकारी में हुए बदलावों की सूचना पाने के लिए सदस्यता लेना

सब कुछ सेट अप करने के बाद, आपको FusedLocationProviderClient को यह बताना होगा कि आपको अपडेट चाहिए.

  1. base मॉड्यूल में, ForegroundOnlyLocationService.kt फ़ाइल में Step 1.5, Subscribe to location changes खोजें.
  2. टिप्पणी के बाद यह कोड जोड़ें.
// TODO: Step 1.5, Subscribe to location changes.
fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper())

requestLocationUpdates() कॉल से, FusedLocationProviderClient को यह पता चलता है कि आपको जगह की जानकारी के अपडेट चाहिए.

आपने पहले जो LocationRequest और LocationCallback तय किए थे, शायद आपको उनकी पहचान हो. इनसे FusedLocationProviderClient को आपके अनुरोध के लिए, सेवा की क्वालिटी से जुड़े पैरामीटर के बारे में पता चलता है. साथ ही, यह भी पता चलता है कि अपडेट होने पर इसे क्या कॉल करना चाहिए. आखिर में, Looper ऑब्जेक्ट, कॉलबैक के लिए थ्रेड के बारे में बताता है.

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

जगह की जानकारी में हुए बदलावों की सूचना पाने की सुविधा बंद करना

जब ऐप्लिकेशन को जगह की जानकारी का ऐक्सेस नहीं चाहिए, तब जगह की जानकारी के अपडेट से ऑप्ट आउट करना ज़रूरी होता है.

  1. base मॉड्यूल में, ForegroundOnlyLocationService.kt फ़ाइल में TODO: Step 1.6, Unsubscribe to location changes खोजें.
  2. टिप्पणी के बाद यह कोड जोड़ें.
// TODO: Step 1.6, Unsubscribe to location changes.
val removeTask = fusedLocationProviderClient.removeLocationUpdates(locationCallback)
removeTask.addOnCompleteListener { task ->
   if (task.isSuccessful) {
       Log.d(TAG, "Location Callback removed.")
       stopSelf()
   } else {
       Log.d(TAG, "Failed to remove Location Callback.")
   }
}

removeLocationUpdates() तरीके से एक टास्क सेट अप किया जाता है, ताकि FusedLocationProviderClient को यह पता चल सके कि अब आपको अपने LocationCallback के लिए जगह की जानकारी के अपडेट नहीं चाहिए. addOnCompleteListener(), टास्क पूरा होने पर कॉलबैक देता है और Task को लागू करता है.

पिछले चरण की तरह, आपने देखा होगा कि यह कोड try/catch स्टेटमेंट के अंदर है. इस तरीके के लिए, इस तरह के ब्लॉक की ज़रूरत होती है. ऐसा इसलिए, क्योंकि जब आपके ऐप्लिकेशन के पास जगह की जानकारी ऐक्सेस करने की अनुमति नहीं होती है, तब SecurityException होता है

आपको यह लग सकता है कि सदस्यता लेने/छोड़ने का कोड शामिल करने वाले तरीकों को कब कॉल किया जाता है. जब उपयोगकर्ता बटन पर टैप करता है, तब ये मुख्य क्लास में ट्रिगर होते हैं. अगर आपको यह देखना है, तो MainActivity.kt क्लास देखें.

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

Android Studio से अपना ऐप्लिकेशन चलाएं और जगह की जानकारी वाले बटन को आज़माएं.

आपको आउटपुट स्क्रीन पर जगह की जानकारी दिखेगी. यह Android 9 के लिए पूरी तरह से काम करने वाला ऐप्लिकेशन है.

2ae45c4e297e3681.png

d66089bfb532e993.png

5. Android 10 के साथ काम करता है

इस सेक्शन में, Android 10 के लिए सहायता जोड़ी जाती है.

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

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

टारगेट एसडीके 29

  1. base मॉड्यूल में, build.gradle फ़ाइल में TODO: Step 2.1, Target Android 10 and then Android 11. खोजें.
  2. ये बदलाव करें:
  3. targetSdkVersion को 29 पर सेट करें.

आपका कोड कुछ ऐसा दिखना चाहिए:

android {
   // TODO: Step 2.1, Target Android 10 and then Android 11.
   compileSdkVersion 29
   defaultConfig {
       applicationId "com.example.android.whileinuselocation"
       minSdkVersion 26
       targetSdkVersion 29
       versionCode 1
       versionName "1.0"
   }
...
}

ऐसा करने के बाद, आपसे अपने प्रोजेक्ट को सिंक करने के लिए कहा जाएगा. अभी सिंक करें पर क्लिक करें.

153f70847e0ec320.png

इसके बाद, आपका ऐप्लिकेशन Android 10 के लिए लगभग तैयार हो जाएगा.

फ़ोरग्राउंड सेवा का टाइप जोड़ें

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

base मॉड्यूल में, AndroidManifest.xml में TODO: 2.2, Add foreground service type खोजें. इसके बाद, <service> एलिमेंट में यह कोड जोड़ें:

android:foregroundServiceType="location"

आपका कोड कुछ ऐसा दिखना चाहिए:

<application>
   ...

   <!-- Foreground services in Android 10+ require type. -->
   <!-- TODO: 2.2, Add foreground service type. -->
   <service
       android:name="com.example.android.whileinuselocation.ForegroundOnlyLocationService"
       android:enabled="true"
       android:exported="false"
       android:foregroundServiceType="location" />
</application>

हो गया! आपका ऐप्लिकेशन, Android 10 पर "इस्तेमाल के दौरान" जगह की जानकारी ऐक्सेस करने की सुविधा देता है. इसके लिए, Android में जगह की जानकारी ऐक्सेस करने के सबसे सही तरीके अपनाए जाते हैं.

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

Android Studio से अपना ऐप्लिकेशन चलाएं और जगह की जानकारी वाले बटन को आज़माएं.

सब कुछ पहले की तरह काम करेगा. हालांकि, अब यह Android 10 पर काम करेगा. अगर आपने पहले जगह की जानकारी ऐक्सेस करने की अनुमतियां स्वीकार नहीं की थीं, तो अब आपको अनुमति वाली स्क्रीन दिखेगी!

6a1029175b467c77.png

c7c1d226e49a121.png

39a262b66a275f66.png

6. Android 11 के साथ काम करता है

इस सेक्शन में, Android 11 को टारगेट किया जाता है.

अच्छी खबर यह है कि आपको build.gradle फ़ाइल के अलावा, किसी भी फ़ाइल में बदलाव करने की ज़रूरत नहीं है!

टारगेट एसडीके 11

  1. base मॉड्यूल में, build.gradle फ़ाइल में TODO: Step 2.1, Target SDK खोजें.
  2. ये बदलाव करें:
  3. compileSdkVersion से 30
  4. targetSdkVersion से 30

आपका कोड कुछ ऐसा दिखना चाहिए:

android {
   TODO: Step 2.1, Target Android 10 and then Android 11.
   compileSdkVersion 30
   defaultConfig {
       applicationId "com.example.android.whileinuselocation"
       minSdkVersion 26
       targetSdkVersion 30
       versionCode 1
       versionName "1.0"
   }
...
}

ऐसा करने के बाद, आपसे अपने प्रोजेक्ट को सिंक करने के लिए कहा जाएगा. अभी सिंक करें पर क्लिक करें.

153f70847e0ec320.png

इसके बाद, आपका ऐप्लिकेशन Android 11 के लिए तैयार हो जाएगा!

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

Android Studio से अपना ऐप्लिकेशन चलाएं और बटन पर क्लिक करके देखें.

सब कुछ पहले की तरह काम करेगा. हालांकि, अब यह Android 11 पर काम करेगा. अगर आपने पहले जगह की जानकारी ऐक्सेस करने की अनुमतियां स्वीकार नहीं की थीं, तो अब आपको अनुमति वाली स्क्रीन दिखेगी!

73d8cc88c5877c25.png

cc98fac6e089bc4.png

7. Android के लिए जगह की जानकारी से जुड़ी रणनीतियां

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

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

सिर्फ़ उन अनुमतियों का अनुरोध करें जिनकी आपको ज़रूरत है

अनुमतियां सिर्फ़ तब मांगें, जब उनकी ज़रूरत हो. उदाहरण के लिए:

  • जब तक ज़रूरी न हो, तब तक ऐप्लिकेशन के चालू होने पर जगह की जानकारी ऐक्सेस करने की अनुमति न मांगें.
  • अगर आपका ऐप्लिकेशन Android 10 या उसके बाद वाले वर्शन को टारगेट करता है और उसमें फ़ोरग्राउंड सेवा है, तो मेनिफ़ेस्ट में foregroundServiceType "location" का एलान करें.
  • जब तक आपके पास बैकग्राउंड में जगह की जानकारी ऐक्सेस करने की अनुमति का अनुरोध करने का कोई मान्य मामला न हो, तब तक ऐसा न करें. इसके बारे में उपयोगकर्ता की जगह की जानकारी को ज़्यादा सुरक्षित और पारदर्शी तरीके से ऐक्सेस करना लेख में बताया गया है.

अनुमति न मिलने पर, ग्रेसफ़ुल डिग्रेडेशन की सुविधा उपलब्ध कराएं

उपयोगकर्ताओं को बेहतर अनुभव देने के लिए, अपने ऐप्लिकेशन को इस तरह से डिज़ाइन करें कि वह इन स्थितियों को आसानी से हैंडल कर सके:

  • आपके ऐप्लिकेशन के पास जगह की जानकारी का ऐक्सेस नहीं है.
  • बैकग्राउंड में चलने पर, आपके ऐप्लिकेशन के पास जगह की जानकारी को ऐक्सेस करने की अनुमति नहीं होती.

8. बधाई हो

आपने Android पर जगह की जानकारी के अपडेट पाने का तरीका सीखा. साथ ही, सबसे सही तरीकों को ध्यान में रखा!

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