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 नहीं है, तो आप प्रोजेक्ट को एक ज़िप फ़ाइल के रूप में पा सकते हैं:

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

Android Studio खोलें. इसके बाद, "मौजूदा Android Studio प्रोजेक्ट खोलें" को चुनें पर जाएं और प्रोजेक्ट डायरेक्ट्री खोलें.

प्रोजेक्ट लोड होने के बाद, आपको एक सूचना भी दिखाई दे सकती है कि 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 एम्युलेटर को सेट अप करने के बारे में जानकारी के लिए, सिम्युलेटर पर चलाएं देखें.

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

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

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

99600e9d44527ab.png

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

99bf1dae46f99af3.png

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

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

कॉन्सेप्ट

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

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

जगह की जानकारी को ऐक्सेस करने के तरीके

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

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

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

सिर्फ़ ऐप्लिकेशन इस्तेमाल करते समय अनुमति दें की जगह की जानकारी के अपडेट को पूरी तरह से इस्तेमाल करने के लिए, आपको यह ध्यान रखना होगा कि उपयोगकर्ता आपके ऐप्लिकेशन से कब बाहर जाएगा. ऐसी स्थिति में भी अपडेट पाने के लिए, आपको फ़ोरग्राउंड 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 के लिए सहायता जोड़ी है.

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

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

टारगेट SDK टूल 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 Studio से अपना ऐप्लिकेशन चलाएं और 'जगह की जानकारी' बटन का इस्तेमाल करके देखें.

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

6a1029175b467c77.png

c7c1d226e49a121.png

39a262b66a275f66.png

6. Android 11 पर काम करता है

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

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

टारगेट SDK 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 या इसके बाद वाले वर्शन को टारगेट करता है और आपके पास फ़ोरग्राउंड सेवा है, तो मेनिफ़ेस्ट में "location" के लिए foregroundServiceType का एलान करें.
  • बैकग्राउंड में जगह की जानकारी ऐक्सेस करने की अनुमतियों का अनुरोध तब तक न करें, जब तक आपके पास इस्तेमाल का मान्य उदाहरण न हो. इस बारे में, उपयोगकर्ता की जगह की जानकारी के लिए ज़्यादा सुरक्षित और ज़्यादा पारदर्शी ऐक्सेस सेक्शन में बताया गया है.

अनुमति न मिलने पर, ग्रेसफ़ुल डिग्रेडेशन पाने में मदद करें

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

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

8. बधाई हो

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

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