दूसरे ऐप्लिकेशन के साथ इंटरैक्शन प्रतिबंधित करना

अनुमतियां सिर्फ़ सिस्टम की सुविधाओं के लिए नहीं होती हैं. आपके पास यह तय करने का विकल्प भी है कि दूसरे ऐप्लिकेशन, आपके ऐप्लिकेशन के कॉम्पोनेंट के साथ कैसे इंटरैक्ट कर सकते हैं.

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

किसी दूसरे ऐप्लिकेशन की अनुमतियां देखना

किसी दूसरे ऐप्लिकेशन की अनुमतियों का सेट देखने के लिए, किसी डिवाइस या एमुलेटर का इस्तेमाल करके यह तरीका अपनाएं:

  1. किसी ऐप्लिकेशन की ऐप्लिकेशन की जानकारी वाली स्क्रीन खोलें.
  2. अनुमतियां को चुनें. ऐप्लिकेशन की अनुमतियां स्क्रीन लोड हो जाएगी.

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

अनुमतियों की जांच करने के कई अन्य काम के तरीके हैं:

  • किसी सेवा को कॉल करते समय, अनुमति वाली स्ट्रिंग को Context.checkCallingPermission() में पास करें. यह तरीका एक पूर्णांक दिखाता है, जिससे पता चलता है कि कॉल करने की मौजूदा प्रोसेस को अनुमति दी गई है या नहीं. ध्यान दें कि इसका इस्तेमाल सिर्फ़ तब किया जा सकता है, जब किसी दूसरी प्रोसेस से आने वाले कॉल को एक्सीक्यूट किया जा रहा हो. आम तौर पर, यह कॉल किसी सेवा से पब्लिश किए गए आईडीएल इंटरफ़ेस या किसी दूसरी प्रोसेस से मिलता है.
  • यह देखने के लिए कि किसी दूसरी प्रोसेस को कोई खास अनुमति दी गई है या नहीं, प्रोसेस (पीआईडी) को Context.checkPermission() में पास करें.
  • यह देखने के लिए कि किसी दूसरे पैकेज को कोई खास अनुमति दी गई है या नहीं, पैकेज का नाम PackageManager.checkPermission() में डालें.

अपने ऐप्लिकेशन की गतिविधियों के साथ इंटरैक्शन पर पाबंदी लगाना

मेनिफ़ेस्ट में <activity> टैग के लिए android:permission एट्रिब्यूट का इस्तेमाल करके, यह पाबंदी लगाएं कि कौनसे अन्य ऐप्लिकेशन उस Activity को शुरू कर सकते हैं. अनुमति की जांच, Context.startActivity() और Activity.startActivityForResult() के दौरान की जाती है. अगर कॉलर के पास ज़रूरी अनुमति नहीं है, तो एक SecurityException दिखता है.

अपने ऐप्लिकेशन की सेवाओं के साथ इंटरैक्शन पर पाबंदी लगाना

मेनिफ़ेस्ट में <service> टैग के लिए android:permission एट्रिब्यूट का इस्तेमाल करें. इससे यह तय किया जा सकता है कि कौनसे अन्य ऐप्लिकेशन, इससे जुड़े Service को शुरू या उससे बंधे. अनुमति की जांच, Context.startService(), Context.stopService(), और Context.bindService() के दौरान की जाती है. अगर कॉलर के पास ज़रूरी अनुमति नहीं है, तो SecurityException गड़बड़ी दिखती है.

अपने ऐप्लिकेशन के कॉन्टेंट की सेवा देने वाली कंपनियों के साथ इंटरैक्शन पर पाबंदी लगाना

android:permission एट्रिब्यूट का इस्तेमाल करके, <provider> टैग पर पाबंदी लगाएं, ताकि यह तय किया जा सके कि कौनसे अन्य ऐप्लिकेशन, ContentProvider में मौजूद डेटा को ऐक्सेस कर सकते हैं. (कॉन्टेंट उपलब्ध कराने वाली कंपनियों के पास, सुरक्षा से जुड़ी एक और अहम सुविधा होती है. इसे यूआरआई अनुमतियां कहा जाता है. इस सुविधा के बारे में नीचे दिए गए सेक्शन में बताया गया है.) दूसरे कॉम्पोनेंट के मुकाबले, कॉन्टेंट प्रोवाइडर के लिए दो अलग-अलग अनुमति एट्रिब्यूट सेट किए जा सकते हैं: android:readPermission यह तय करता है कि कौनसे दूसरे ऐप्लिकेशन, कॉन्टेंट प्रोवाइडर से डेटा पढ़ सकते हैं और android:writePermission यह तय करता है कि कौनसे दूसरे ऐप्लिकेशन, कॉन्टेंट प्रोवाइडर में डेटा लिख सकते हैं. ध्यान दें कि अगर किसी सेवा देने वाली कंपनी के डेटा को पढ़ने और उसमें बदलाव करने, दोनों की अनुमति दी गई है, तो सिर्फ़ डेटा में बदलाव करने की अनुमति होने पर भी, ऐप्लिकेशन को डेटा पढ़ने की अनुमति नहीं मिलती.

अनुमतियों की जांच तब की जाती है, जब पहली बार सेवा देने वाली कंपनी को वापस पाया जाता है और जब कोई ऐप्लिकेशन, सेवा देने वाली कंपनी पर कार्रवाइयां करता है. अगर अनुरोध करने वाले ऐप्लिकेशन के पास दोनों अनुमतियां नहीं हैं, तो SecurityException गड़बड़ी का मैसेज दिखता है. ContentResolver.query() का इस्तेमाल करने के लिए, पढ़ने की अनुमति ज़रूरी है. ContentResolver.insert(), ContentResolver.update() या ContentResolver.delete() का इस्तेमाल करने के लिए, उसमें बदलाव करने की अनुमति ज़रूरी है. इन सभी मामलों में, ज़रूरी अनुमति न होने पर SecurityException दिखता है.

हर यूआरआई के हिसाब से ऐक्सेस देना

इस सिस्टम की मदद से, आपको यह कंट्रोल करने की सुविधा मिलती है कि दूसरे ऐप्लिकेशन आपके ऐप्लिकेशन के कॉन्टेंट की सेवा देने वाली कंपनियों को कैसे ऐक्सेस कर सकते हैं. खास तौर पर, कॉन्टेंट उपलब्ध कराने वाली कंपनी, पढ़ने और लिखने की अनुमतियों की मदद से खुद को सुरक्षित रख सकती है. साथ ही, अपने डायरेक्ट क्लाइंट को अन्य ऐप्लिकेशन के साथ खास यूआरआई शेयर करने की अनुमति दे सकती है. इस मॉडल के साथ अपने ऐप्लिकेशन के काम करने की जानकारी देने के लिए, android:grantUriPermissions एट्रिब्यूट या <grant-uri-permission> एलिमेंट का इस्तेमाल करें.

हर यूआरआई के हिसाब से भी अनुमतियां दी जा सकती हैं. कोई गतिविधि शुरू करते समय या किसी गतिविधि का नतीजा दिखाते समय, Intent.FLAG_GRANT_READ_URI_PERMISSION इंटेंट फ़्लैग, Intent.FLAG_GRANT_WRITE_URI_PERMISSION इंटेंट फ़्लैग या दोनों फ़्लैग सेट करें. इससे अन्य ऐप्लिकेशन को, इंटेंट में शामिल डेटा यूआरआई के लिए, क्रमशः पढ़ने, लिखने या पढ़ने/लिखने की अनुमतियां मिलती हैं. अन्य ऐप्लिकेशन, किसी खास यूआरआई के लिए ये अनुमतियां पाते हैं. इससे कोई फ़र्क़ नहीं पड़ता कि उनके पास कॉन्टेंट उपलब्ध कराने वाली कंपनी के डेटा को ऐक्सेस करने की अनुमति है या नहीं.

उदाहरण के लिए, मान लें कि कोई उपयोगकर्ता आपके ऐप्लिकेशन का इस्तेमाल करके, इमेज अटैचमेंट वाला ईमेल देख रहा है. आम तौर पर, अन्य ऐप्लिकेशन ईमेल का कॉन्टेंट ऐक्सेस नहीं कर सकते. हालांकि, हो सकता है कि वे इमेज देखना चाहें. आपका ऐप्लिकेशन, इमेज देखने वाले ऐप्लिकेशन को इमेज दिखाने के लिए, इंटेंट और Intent.FLAG_GRANT_READ_URI_PERMISSION इंटेंट फ़्लैग का इस्तेमाल कर सकता है.

ऐप्लिकेशन की उपलब्धता भी एक अहम बात है. अगर आपका ऐप्लिकेशन Android 11 (एपीआई लेवल 30) या उसके बाद के वर्शन को टारगेट करता है, तो सिस्टम कुछ ऐप्लिकेशन को आपके ऐप्लिकेशन के लिए अपने-आप दिखाता है और अन्य ऐप्लिकेशन को डिफ़ॉल्ट रूप से छिपा देता है. अगर आपके ऐप्लिकेशन में कोई कॉन्टेंट प्रोवाइडर है और उसने किसी दूसरे ऐप्लिकेशन को यूआरआई की अनुमतियां दी हैं, तो आपका ऐप्लिकेशन उस दूसरे ऐप्लिकेशन में अपने-आप दिखने लगता है.

ज़्यादा जानकारी के लिए, grantUriPermission(), revokeUriPermission(), और checkUriPermission() तरीकों के लिए रेफ़रंस मटीरियल देखें.

अपने ऐप्लिकेशन के ब्रॉडकास्ट रिसीवर के साथ इंटरैक्शन पर पाबंदी लगाना

<receiver> टैग के लिए android:permission एट्रिब्यूट का इस्तेमाल करके, यह तय करें कि कौनसे अन्य ऐप्लिकेशन, इससे जुड़े BroadcastReceiver पर ब्रॉडकास्ट भेज सकते हैं. Context.sendBroadcast() के वापस आने के बाद अनुमति की जांच की जाती है, क्योंकि सिस्टम सबमिट किए गए ब्रॉडकास्ट को दिए गए रिसीवर को डिलीवर करने की कोशिश करता है. इसका मतलब है कि अनुमति न मिलने पर, कॉल करने वाले को कोई अपवाद नहीं दिखता. सिर्फ़ Intent नहीं दिखता.

इसी तरह, Context.registerReceiver() को अनुमति देकर यह कंट्रोल किया जा सकता है कि प्रोग्राम के ज़रिए रजिस्टर किए गए रिसीवर पर कौनसे अन्य ऐप्लिकेशन ब्रॉडकास्ट कर सकते हैं. इसके अलावा, Context.sendBroadcast() को कॉल करते समय अनुमति दी जा सकती है, ताकि यह तय किया जा सके कि ब्रॉडकास्ट रिसीवर को ब्रॉडकास्ट कब मिलेगा.

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