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

Android 10 और 11 पर, उपयोगकर्ताओं को अपने ऐप्लिकेशन की जगह की जानकारी का ज़्यादा कंट्रोल मिलता है.

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

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

Android 10

Android 11

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

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

आप क्या कर सकते हैं

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

आपको क्या चाहिए

  • कोड चलाने के लिए, Android Studio 3.4 या उसके बाद का वर्शन
  • ऐसा डिवाइस/एम्युलेटर जो Android 10 और 11 वाले वर्शन के लिए, डेवलपर की झलक दिखा रहा है

शुरुआती प्रोजेक्ट का रेपो बनाएं

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

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

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

अगर आपके पास Git नहीं है, तो आप प्रोजेक्ट को zip फ़ाइल के रूप में पा सकते हैं:

पिन डाउनलोड करें

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

Android Studio खोलें और &कोटेशन का विकल्प चुनें;किसी मौजूदा Android Studio प्रोजेक्ट को खोलें" और स्वागत स्क्रीन से प्रोजेक्ट डायरेक्ट्री खोलें.

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

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

यहां दो फ़ोल्डर (base और complete) हैं. हर फ़ोल्डर को &kot;module&कोटेशन के तौर पर जाना जाता है.

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

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

अगर आपको भाषा के बदलावों को लागू करने के लिए फिर से लोड करें? या ऐसा ही कुछ करने का संकेत मिलता है, तो हां चुनें.

स्टार्टर प्रोजेक्ट को समझना

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

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

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

एम्युलेटर सेट अप

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

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

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

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


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


हो सकता है कि आउटपुट स्क्रीन पर, जगह की जानकारी न दिखे. यह ' क्योंकि आपने अभी तक स्थान कोड नहीं जोड़ा है.

कॉन्सेप्ट

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

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

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

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

  • सिर्फ़ ऐप्लिकेशन इस्तेमाल करते समय अनुमति दें
  • ज़्यादातर ऐप्लिकेशन के लिए, यह विकल्प सुझाया गया है. इसे "इस्तेमाल में है" के तौर पर भी रखा जाता है. इसे "सभी के लिए उपलब्ध" नीति के नाम से भी जाना जाता है. यह विकल्प 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 पा सकते हैं.

अब जब आप मुख्य रूप से जान लेते हैं कि आप क्या कर रहे हैं, तो कोड के साथ शुरू करें!

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

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

अनुमतियां

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

नीचे हाइलाइट की गई अनुमति हाइलाइट दी गई हैं: इस हिस्से के लिए कुछ करने की ज़रूरत नहीं है:

  1. बताएं कि आप AndroidManifest.xml में किस अनुमति का इस्तेमाल करते हैं.
  2. जगह की जानकारी का ऐक्सेस देने से पहले, यह देख लें कि उपयोगकर्ता ने ऐसा करने के लिए आपके ऐप्लिकेशन को अनुमति दी है या नहीं. अगर आपके ऐप्लिकेशन को अभी तक #39;अनुमति नहीं मिली है, तो ऐक्सेस मांगें.
  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().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. सभी टिप्पणियां कैसे काम करती हैं, यह समझने के लिए टिप्पणियां पढ़ें.

लोकेशन कॉलबैक शुरू करना

  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)

       if (locationResult?.lastLocation != null) {

           // 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 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))
           }
       } else {
           Log.d(TAG, "Location information isn't available.")
       }
   }
}

जगह की जानकारी का नया अपडेट उपलब्ध होने पर, FusedLocationProviderClient आपको यह कॉल करेगा. इसे LocationCallback बनाया जाएगा.

अपने कॉलबैक में, आप पहले 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.myLooper())

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 के लिए पूरी तरह से उपलब्ध ऐप्लिकेशन है.

इस सेक्शन में, आप Android 10 के साथ काम करने वाले वर्शन जोड़ते हैं.

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

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

टारगेट SDK 29

  1. base मॉड्यूल में, build.gradle फ़ाइल को TODO: Step 2.1, Target SDK 10 के लिए खोजें.
  2. ये बदलाव करें:
  1. compileSdkVersion को 29 पर सेट करें.
  2. buildToolsVersion को "29.0.3" पर सेट करें.
  3. targetSdkVersion को 29 पर सेट करें.

आपका कोड कुछ ऐसा दिखेगा:

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

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

इसके बाद, आपका ऐप्लिकेशन 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 पर जगह की जानकारी देने के लिए सबसे सही तरीकों का इस्तेमाल करके, Android 10 की जगह की जानकारी के लिए, कोटेशन के इस्तेमाल के दौरान काम करता है.

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

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

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

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

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

टारगेट SDK R

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

आपका कोड कुछ ऐसा दिखेगा:

android {
   // TODO: Step 2.1, Target Android 10.
   compileSdkVersion "android-R"
   buildToolsVersion "29.0.2"
   defaultConfig {
       applicationId "com.example.android.whileinuselocation"
       minSdkVersion 26
       targetSdkVersion "R"
       versionCode 1
       versionName "1.0"
   }
...
}

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

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

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

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

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

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

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

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

ज़रूरत पड़ने पर ही अनुमतियां मांगें. उदाहरण के लिए:

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

अनुमति न दिए जाने पर, 'ग्रेसफ़ुल डिग्रेडेशन' (सहायता के लिए) का इस्तेमाल करना

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

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

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

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