जब आपके ऐप्लिकेशन की किसी सुविधा को जगह की जानकारी का ऐक्सेस चाहिए, तो अनुमति का अनुरोध करने से पहले, तब तक इंतज़ार करें, जब तक उपयोगकर्ता उस सुविधा के साथ इंटरैक्ट न कर ले. यह वर्कफ़्लो, ऐप्लिकेशन की अनुमतियों का अनुरोध करने के तरीके के बारे में बताने वाली गाइड में बताए गए, संदर्भ के हिसाब से रनटाइम की अनुमतियां मांगने के सबसे सही तरीके का पालन करता है.
पहली इमेज में, इस प्रोसेस को पूरा करने का उदाहरण दिया गया है. ऐप्लिकेशन में "जगह की जानकारी शेयर करें" सुविधा है. इसके लिए, फ़ोरग्राउंड में जगह की जानकारी ऐक्सेस करना ज़रूरी है. हालांकि, ऐप्लिकेशन तब तक जगह की जानकारी की अनुमति का अनुरोध नहीं करता, जब तक उपयोगकर्ता जगह की जानकारी शेयर करें बटन को नहीं चुनता.
उपयोगकर्ता सिर्फ़ जगह की अनुमानित जानकारी दे सकता है
Android 12 (एपीआई लेवल 31) या उसके बाद के वर्शन पर, उपयोगकर्ता आपके ऐप्लिकेशन से अनुरोध कर सकते हैं कि वह सिर्फ़ जगह की अनुमानित जानकारी ऐक्सेस करे. भले ही, आपका ऐप्लिकेशन ACCESS_FINE_LOCATION
रनटाइम की अनुमति का अनुरोध करता हो.
उपयोगकर्ता के इस संभावित व्यवहार को मैनेज करने के लिए, ACCESS_FINE_LOCATION
की अनुमति का अनुरोध खुद न करें. इसके बजाय, एक ही रनटाइम अनुरोध में ACCESS_FINE_LOCATION
अनुमति और ACCESS_COARSE_LOCATION
अनुमति, दोनों का अनुरोध करें. अगर सिर्फ़ ACCESS_FINE_LOCATION
का अनुरोध किया जाता है, तो सिस्टम Android 12 के कुछ रिलीज़ पर अनुरोध को अनदेखा कर देता है. अगर आपका ऐप्लिकेशन Android 12 या उसके बाद के वर्शन को टारगेट करता है, तो सिस्टम Logcat में गड़बड़ी का यह मैसेज लॉग करता है:
ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION.
जब आपका ऐप्लिकेशन ACCESS_FINE_LOCATION
और ACCESS_COARSE_LOCATION
, दोनों के लिए अनुरोध करता है, तो सिस्टम की अनुमतियों वाले डायलॉग में उपयोगकर्ता के लिए ये विकल्प शामिल होते हैं:
- सटीक: इससे आपके ऐप्लिकेशन को जगह की सटीक जानकारी मिलती है.
- अनुमानित: इससे आपके ऐप्लिकेशन को जगह की सिर्फ़ अनुमानित जानकारी मिलती है.
तीसरी इमेज से पता चलता है कि डायलॉग बॉक्स में दोनों विकल्पों के लिए विज़ुअल क्यू दिया गया है, ताकि उपयोगकर्ता को विकल्प चुनने में मदद मिल सके. जगह की जानकारी की सटीक जानकारी देने के लिए, उपयोगकर्ता को तीन बटन में से किसी एक पर टैप करना होता है. इससे, वह अनुमति देने की अवधि चुन पाता है.
Android 12 और उसके बाद के वर्शन में, उपयोगकर्ता किसी भी ऐप्लिकेशन के लिए जगह की सटीक जानकारी की सेटिंग को सेट करने के लिए, सिस्टम सेटिंग पर जा सकते हैं. भले ही, उस ऐप्लिकेशन के लिए टारगेट SDK टूल का कोई भी वर्शन इस्तेमाल किया जा रहा हो. यह तब भी लागू होता है, जब आपका ऐप्लिकेशन Android 11 या इससे पहले के वर्शन वाले डिवाइस पर इंस्टॉल हो और उपयोगकर्ता अपने डिवाइस को Android 12 या इसके बाद के वर्शन पर अपग्रेड कर दे.
उपयोगकर्ता की पसंद से, अनुमतियों पर असर पड़ता है
इस टेबल में, उन अनुमतियों के बारे में बताया गया है जिन्हें सिस्टम आपके ऐप्लिकेशन को देता है. ये अनुमतियां, उपयोगकर्ता के चुने गए विकल्पों के आधार पर दी जाती हैं. ये विकल्प, अनुमतियों के रनटाइम डायलॉग में चुने जाते हैं:
सटीक | आस-पास | |
---|---|---|
ऐप्लिकेशन इस्तेमाल करते समय | ACCESS_FINE_LOCATION और ACCESS_COARSE_LOCATION |
ACCESS_COARSE_LOCATION |
सिर्फ़ इस बार अनुमति दें | ACCESS_FINE_LOCATION और ACCESS_COARSE_LOCATION |
ACCESS_COARSE_LOCATION |
अस्वीकार करें | जगह की जानकारी की अनुमतियां नहीं दी गई हैं | जगह की जानकारी की अनुमतियां नहीं दी गई हैं |
यह पता करने के लिए कि सिस्टम ने आपके ऐप्लिकेशन को कौनसी अनुमतियां दी हैं, अनुमतियों के अनुरोध की रिटर्न वैल्यू देखें. यहां दिए गए कोड की तरह के कोड में, Jetpack लाइब्रेरी का इस्तेमाल किया जा सकता है. इसके अलावा, प्लैटफ़ॉर्म लाइब्रेरी का इस्तेमाल भी किया जा सकता है. इन लाइब्रेरी में, अनुमति के अनुरोध वाले कोड को खुद मैनेज किया जा सकता है.
Kotlin
@RequiresApi(Build.VERSION_CODES.N) fun requestPermissions() { val locationPermissionRequest = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) { permissions -> when { permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> { // Precise location access granted. } permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> { // Only approximate location access granted. } else -> { // No location access granted. } } } // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions: // https://developer.android.com/training/permissions/requesting#request-permission locationPermissionRequest.launch( arrayOf( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION ) ) }
Java
private void requestPermissions() { ActivityResultLauncher<String[]> locationPermissionRequest = registerForActivityResult(new ActivityResultContracts .RequestMultiplePermissions(), result -> { Boolean fineLocationGranted = null; Boolean coarseLocationGranted = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { fineLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_FINE_LOCATION, false); coarseLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_COARSE_LOCATION,false); } if (fineLocationGranted != null && fineLocationGranted) { // Precise location access granted. } else if (coarseLocationGranted != null && coarseLocationGranted) { // Only approximate location access granted. } else { // No location access granted. } } ); // ... // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions. locationPermissionRequest.launch(new String[] { Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION }); }
जगह की सटीक जानकारी के लिए अपग्रेड का अनुरोध करना
आपके पास उपयोगकर्ता से, ऐप्लिकेशन के लिए जगह की अनुमानित जानकारी के ऐक्सेस को, जगह की सटीक जानकारी के ऐक्सेस में अपग्रेड करने के लिए कहने का विकल्प होता है. हालांकि, उपयोगकर्ता से अपने ऐप्लिकेशन के लिए सटीक जगह की जानकारी ऐक्सेस करने की अनुमति देने का अनुरोध करने से पहले, यह देख लें कि आपके ऐप्लिकेशन के इस्तेमाल के उदाहरण के लिए, सटीक जगह की जानकारी की ज़रूरत है या नहीं. अगर आपके ऐप्लिकेशन को किसी डिवाइस को ब्लूटूथ या वाई-फ़ाई की मदद से आस-पास मौजूद डिवाइसों से जोड़ना है, तो ACCESS_FINE_LOCATION
अनुमति का अनुरोध करने के बजाय, स्मार्टवॉच से जुड़े डिवाइस को जोड़ने की सुविधा या ब्लूटूथ की अनुमतियों का इस्तेमाल करें.
उपयोगकर्ता से अनुरोध करें कि वह आपके ऐप्लिकेशन के लिए, जगह की जानकारी के अनुमानित ऐक्सेस को सटीक ऐक्सेस में अपग्रेड करे. इसके लिए, यह तरीका अपनाएं:
- अगर ज़रूरी हो, तो बताएं कि आपके ऐप्लिकेशन को अनुमति क्यों चाहिए.
ACCESS_FINE_LOCATION
औरACCESS_COARSE_LOCATION
की अनुमतियों के लिए फिर से अनुरोध करें. उपयोगकर्ता ने पहले ही सिस्टम को आपके ऐप्लिकेशन को जगह की अनुमानित जानकारी देने की अनुमति दे दी है. इसलिए, इस बार सिस्टम डायलॉग अलग है, जैसा कि चौथे और पांचवें चित्र में दिखाया गया है:
शुरुआत में सिर्फ़ फ़ोरग्राउंड में जगह की जानकारी का अनुरोध करना
भले ही, आपके ऐप्लिकेशन की कई सुविधाओं को जगह की जानकारी का ऐक्सेस चाहिए, लेकिन हो सकता है कि उनमें से सिर्फ़ कुछ को बैकग्राउंड में जगह की जानकारी का ऐक्सेस चाहिए. इसलिए, हमारा सुझाव है कि आपका ऐप्लिकेशन जगह की जानकारी की अनुमतियों के लिए बढ़ते अनुरोध करता रहे. इसके लिए, पहले फ़ोरग्राउंड में जगह की जानकारी ऐक्सेस करने और फिर बैकग्राउंड में जगह की जानकारी ऐक्सेस करने का अनुरोध करें. ज़्यादा अनुमति मांगने की सुविधा का इस्तेमाल करके, उपयोगकर्ताओं को ज़्यादा कंट्रोल और पारदर्शिता मिलती है. ऐसा इसलिए, क्योंकि वे बेहतर तरीके से समझ सकते हैं कि आपके ऐप्लिकेशन की किन सुविधाओं को बैकग्राउंड में जगह की जानकारी ऐक्सेस करने की ज़रूरत है.
छठी इमेज में, ऐसे ऐप्लिकेशन का उदाहरण दिया गया है जिसे इंक्रीमेंटल अनुरोधों को मैनेज करने के लिए डिज़ाइन किया गया है. "मौजूदा जगह की जानकारी दिखाएं" और "आस-पास की जगहों के सुझाव दें", दोनों सुविधाओं के लिए फ़ोरग्राउंड में जगह की जानकारी ऐक्सेस करना ज़रूरी है. हालांकि, सिर्फ़ "आस-पास की जगहों के सुझाव" वाली सुविधा के लिए, बैकग्राउंड में जगह की जानकारी ऐक्सेस करने की ज़रूरत होती है.
इंक्रीमेंटल अनुरोध करने की प्रोसेस इस तरह है:
सबसे पहले, आपके ऐप्लिकेशन को उपयोगकर्ताओं को उन सुविधाओं के बारे में बताना चाहिए जिनके लिए फ़ोरग्राउंड में जगह की जानकारी ऐक्सेस करना ज़रूरी है. जैसे, पहली इमेज में "जगह की जानकारी शेयर करें" सुविधा या दूसरी इमेज में "मौजूदा जगह की जानकारी दिखाएं" सुविधा.
हमारा सुझाव है कि जब तक आपके ऐप्लिकेशन के पास फ़ोरग्राउंड में जगह की जानकारी का ऐक्सेस न हो, तब तक उन सुविधाओं के लिए उपयोगकर्ता के ऐक्सेस को बंद कर दें जिनके लिए बैकग्राउंड में जगह की जानकारी का ऐक्सेस ज़रूरी है.
बाद में, जब उपयोगकर्ता उन सुविधाओं को एक्सप्लोर करता है जिनके लिए बैकग्राउंड में जगह की जानकारी के ऐक्सेस की ज़रूरत होती है, तब बैकग्राउंड में जगह की जानकारी के ऐक्सेस का अनुरोध किया जा सकता है.
अन्य संसाधन
Android में जगह की जानकारी की अनुमतियों के बारे में ज़्यादा जानने के लिए, यहां दिए गए कॉन्टेंट देखें:
कोडलैब
वीडियो
सैंपल
- जगह की जानकारी की अनुमतियों के इस्तेमाल को दिखाने के लिए सैंपल ऐप्लिकेशन.