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

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

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

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

ज़रूरत के मुताबिक जगह की जानकारी ऐक्सेस करना

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

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

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

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

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_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
Deny जगह की जानकारी ऐक्सेस करने की अनुमति नहीं है जगह की जानकारी ऐक्सेस करने की अनुमति नहीं है

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

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

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

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

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

बढ़ते हुए अनुरोध करने की प्रोसेस यहां दी गई है:

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

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

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

अन्य संसाधन

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

कोडलैब

वीडियो

सैंपल