रनटाइम के दौरान जगह की जानकारी ऐक्सेस करने का अनुरोध करें

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

जगह की जानकारी की अनुमतियां ऐक्सेस करने के लिए दिशा-निर्देश

अपने ऐप्लिकेशन में जगह की जानकारी के ऐक्सेस को लागू करने का तरीका तय करते समय, कुछ सामान्य नियमों का पालन करना ज़रूरी है.

कॉन्टेक्स्ट के हिसाब से जगह की जानकारी ऐक्सेस करना

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

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

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

उपयोगकर्ता, जगह की सिर्फ़ अनुमानित जानकारी ऐक्सेस करने की अनुमति दे सकता है

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 और इसके बाद के वर्शन पर, उपयोगकर्ता सिस्टम सेटिंग में जाकर, किसी भी ऐप्लिकेशन के लिए जगह की सटीक जानकारी की सेटिंग को अपनी पसंद के मुताबिक सेट कर सकते हैं. भले ही, उस ऐप्लिकेशन का टारगेट एसडीके वर्शन कुछ भी हो. यह बात तब भी लागू होती है, जब आपका ऐप्लिकेशन Android 11 या इससे पहले के वर्शन वाले डिवाइस पर इंस्टॉल किया गया हो और उपयोगकर्ता डिवाइस को Android 12 या इसके बाद के वर्शन पर अपग्रेड कर ले.

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

उपयोगकर्ता की पसंद से, अनुमति देने पर असर पड़ता है

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

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

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

  1. अगर ज़रूरी हो, तो बताएं कि आपके ऐप्लिकेशन को अनुमति की ज़रूरत क्यों है.
  2. ACCESS_FINE_LOCATION और ACCESS_COARSE_LOCATION की अनुमतियों के लिए, एक साथ फिर से अनुरोध करें. उपयोगकर्ता ने पहले ही सिस्टम को आपके ऐप्लिकेशन के लिए, जगह की अनुमानित जानकारी देने की अनुमति दे दी है. इसलिए, इस बार सिस्टम डायलॉग अलग है. इसे इमेज 4 और इमेज 5 में दिखाया गया है:
डायलॉग बॉक्स में ये विकल्प होते हैं: 'जगह की सटीक जानकारी देने की अनुमति दें', 'सिर्फ़ इस बार', और 'अनुमति न दें'.
चौथी इमेज. उपयोगकर्ता ने पहले अनुमानित और ऐप्लिकेशन इस्तेमाल करते समय (तीसरी इमेज में दिए गए डायलॉग बॉक्स में) को चुना था.
डायलॉग में 'सिर्फ़ इस बार' और 'अनुमति न दें' विकल्प शामिल हैं.
पांचवीं इमेज. उपयोगकर्ता ने पहले अनुमानित और सिर्फ़ इस बार (तीसरी इमेज में दिए गए डायलॉग बॉक्स में) को चुना था.

शुरुआत में, सिर्फ़ फ़ोरग्राउंड में जगह की जानकारी ऐक्सेस करने का अनुरोध करें

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

छठी इमेज में, एक ऐसे ऐप्लिकेशन का उदाहरण दिखाया गया है जिसे इंक्रीमेंटल अनुरोधों को मैनेज करने के लिए डिज़ाइन किया गया है. "मौजूदा जगह की जानकारी दिखाएं" और "आस-पास की जगहों के सुझाव दें", दोनों सुविधाओं के लिए फ़ोरग्राउंड में जगह की जानकारी का ऐक्सेस ज़रूरी है. हालांकि, सिर्फ़ "आस-पास की जगहों के सुझाव" सुविधा के लिए, बैकग्राउंड में जगह की जानकारी ऐक्सेस करने की अनुमति चाहिए.

फ़ोरग्राउंड में जगह की जानकारी ऐक्सेस करने की सुविधा चालू करने वाला बटन, बैकग्राउंड में जगह की जानकारी ऐक्सेस करने की सुविधा चालू करने वाले बटन से आधी स्क्रीन की दूरी पर मौजूद है
छठी इमेज. दोनों सुविधाओं के लिए, जगह की जानकारी का ऐक्सेस ज़रूरी है. हालांकि, "आस-पास की सुविधाओं के सुझाव" सुविधा के लिए, बैकग्राउंड में जगह की जानकारी का ऐक्सेस ज़रूरी है.

इंक्रीमेंटल अनुरोध करने की प्रोसेस इस तरह है:

  1. सबसे पहले, आपके ऐप्लिकेशन को उपयोगकर्ताओं को उन सुविधाओं के बारे में बताना चाहिए जिनके लिए फ़ोरग्राउंड में जगह की जानकारी का ऐक्सेस ज़रूरी है. जैसे, इमेज 1 में "जगह की जानकारी शेयर करें" सुविधा या इमेज 2 में "मौजूदा जगह की जानकारी दिखाएं" सुविधा.

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

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

अन्य संसाधन

Android में जगह की जानकारी की अनुमतियों के बारे में ज़्यादा जानने के लिए, यह कॉन्टेंट देखें:

कोडलैब

वीडियो

सैंपल