कोई ऐप्लिकेशन, किसी दूसरे ऐप्लिकेशन से चलाए जा रहे वीडियो या ऑडियो को रिकॉर्ड कर सकता है. ऐसे ऐप्लिकेशन को MediaProjection टोकन को सही तरीके से हैंडल करना चाहिए. इस पेज पर, यह तरीका बताया गया है. इसमें यह भी बताया गया है कि डिवाइस एडमिन, स्क्रीनशॉट रिकॉर्ड करने की सुविधा को कैसे बंद कर सकता है. साथ ही, कोई ऑडियो ऐप्लिकेशन, दूसरे ऐप्लिकेशन को अपने कॉन्टेंट को रिकॉर्ड करने से कैसे रोक सकता है.
MediaProjection टोकन को मैनेज करने का तरीका
MediaProjection API, ऐप्लिकेशन को MediaProjection टोकन पाने की अनुमति देता है. इससे ऐप्लिकेशन को स्क्रीन पर मौजूद कॉन्टेंट या ऑडियो को कैप्चर करने के लिए, एक बार का ऐक्सेस मिलता है. Android OS, आपके ऐप्लिकेशन को टोकन देने से पहले, उपयोगकर्ता से अनुमति मांगता है.
ओएस, क्विक सेटिंग के यूज़र इंटरफ़ेस (यूआई) में चालू MediaProjection टोकन दिखाता है. साथ ही, उपयोगकर्ताओं को किसी भी समय टोकन का ऐक्सेस वापस लेने की अनुमति देता है. ऐसा होने पर, सेशन से जुड़े वर्चुअल डिसप्ले या ऑडियो स्ट्रीम को मीडिया स्ट्रीम मिलना बंद हो जाता है. आपके ऐप्लिकेशन को सही तरीके से जवाब देना होगा. ऐसा न करने पर, वह ऑडियो साइलेंस या ब्लैक वीडियो स्ट्रीम रिकॉर्ड करता रहेगा.
टोकन के खो जाने की समस्या को ठीक करने के लिए, MediaProjection इंस्टेंस पर कॉलबैक रजिस्टर करें. इसके लिए, registerCallback तरीके का इस्तेमाल करें. साथ ही, onStop तरीके को कॉल करने पर रिकॉर्डिंग बंद कर दें.
ज़्यादा जानकारी के लिए, मीडिया प्रोजेक्शन लेख पढ़ें.
वीडियो कैप्चर करें
स्क्रीन रिकॉर्डिंग को रोकने के लिए, DevicePolicyManager का इस्तेमाल किया जा सकता है. Android for Work वाले एंटरप्राइज़ खातों के लिए, एडमिन setScreenCaptureDisabled तरीके का इस्तेमाल करके, वर्क प्रोफ़ाइल के लिए Assistant का डेटा इकट्ठा करने की सुविधा बंद कर सकता है.
कोडलैब ऐप्लिकेशन के बिना Android डिवाइसों को मैनेज करना में, स्क्रीनशॉट लेने की सुविधा को बंद करने का तरीका बताया गया है.
ऑडियो प्लेबैक कैप्चर करना
AudioPlaybackCapture API को Android 10 में लॉन्च किया गया था. इस एपीआई की मदद से, ऐप्लिकेशन को दूसरे ऐप्लिकेशन में चल रहे ऑडियो को कॉपी करने की सुविधा मिलती है. यह सुविधा, स्क्रीन कैप्चर करने की सुविधा की तरह ही है. हालांकि, यह ऑडियो के लिए है. इसका मुख्य इस्तेमाल, स्ट्रीमिंग ऐप्लिकेशन के लिए किया जाता है. ये ऐप्लिकेशन, गेम से चलने वाले ऑडियो को कैप्चर करना चाहते हैं.
ध्यान दें कि AudioPlaybackCapture API से, उस ऐप्लिकेशन की लेटेन्सी पर कोई असर नहीं पड़ता जिसका ऑडियो कैप्चर किया जा रहा है.
कैप्चर ऐप्लिकेशन बनाना
सुरक्षा और निजता के लिए, प्लेबैक कैप्चर पर कुछ पाबंदियां लगाई गई हैं. ऑडियो रिकॉर्ड करने के लिए, किसी ऐप्लिकेशन को ये ज़रूरी शर्तें पूरी करनी होंगी:
- ऐप्लिकेशन के पास
RECORD_AUDIOकी अनुमति होनी चाहिए. - ऐप्लिकेशन को
MediaProjectionManager.createScreenCaptureIntent()की ओर से दिखाया गया प्रॉम्प्ट दिखाना होगा. साथ ही, उपयोगकर्ता को इसे स्वीकार करना होगा. - स्क्रीन कैप्चर करने और वीडियो चलाने वाले ऐप्लिकेशन, एक ही उपयोगकर्ता प्रोफ़ाइल में होने चाहिए.
किसी दूसरे ऐप्लिकेशन से ऑडियो कैप्चर करने के लिए, आपके ऐप्लिकेशन को AudioRecord ऑब्जेक्ट बनाना होगा और उसमें AudioPlaybackCaptureConfiguration जोड़ना होगा. ऐसा करने के लिए यह तरीका अपनाएं:
AudioPlaybackCaptureConfigurationबनाने के लिए,AudioPlaybackCaptureConfiguration.Builder.build()को कॉल करें.setAudioPlaybackCaptureConfigको कॉल करके, कॉन्फ़िगरेशन कोAudioRecordपर पास करें.
ऑडियो कैप्चर करने की सुविधा को कंट्रोल करना
आपका ऐप्लिकेशन यह कंट्रोल कर सकता है कि वह किस तरह का कॉन्टेंट रिकॉर्ड कर सकता है. साथ ही, यह भी कंट्रोल कर सकता है कि किस तरह के दूसरे ऐप्लिकेशन, उसके कॉन्टेंट को रिकॉर्ड कर सकते हैं.
ऑडियो कॉन्टेंट के हिसाब से कैप्चर करने की सुविधा को सीमित करना
कोई ऐप्लिकेशन इन तरीकों का इस्तेमाल करके, यह तय कर सकता है कि उसे कौनसी आवाज़ कैप्चर करनी है:
- किसी खास इस्तेमाल को कैप्चर करने की अनुमति देने के लिए, AudioPlaybackCaptureConfiguration.Builder.addMatchingUsage() को
AUDIO_USAGEपास करें. एक से ज़्यादा बार इस्तेमाल करने के बारे में बताने के लिए, इस तरीके को कई बार कॉल करें. - उस इस्तेमाल को कैप्चर करने से रोकने के लिए, AudioPlaybackCaptureConfiguration.excludeUsage() को
AUDIO_USAGEपास करें. एक से ज़्यादा बार इस्तेमाल करने के बारे में बताने के लिए, इस तरीके को कई बार कॉल करें. - किसी खास यूआईडी वाले ऐप्लिकेशन को ही कैप्चर करने के लिए, AudioPlaybackCaptureConfiguration.addMatchingUid() को यूआईडी पास करें. एक से ज़्यादा यूआईडी तय करने के लिए, इस तरीके को कई बार कॉल करें.
- किसी यूआईडी को कैप्चर करने से रोकने के लिए, उसे AudioPlaybackCaptureConfiguration.excludeUid() में पास करें. एक से ज़्यादा यूआईडी तय करने के लिए, इस तरीके को कई बार कॉल करें.
ध्यान दें कि addMatchingUsage() और excludeUsage(), दोनों तरीकों का इस्तेमाल एक साथ नहीं किया जा सकता. आपको इनमें से किसी एक को चुनना होगा. इसी तरह, addMatchingUid() और excludeUid() का एक साथ इस्तेमाल नहीं किया जा सकता.
दूसरे ऐप्लिकेशन के लिए, स्क्रीन कैप्चर करने की सुविधा को सीमित करना
किसी ऐप्लिकेशन को इस तरह कॉन्फ़िगर किया जा सकता है कि दूसरे ऐप्लिकेशन उसका ऑडियो कैप्चर न कर पाएं. किसी ऐप्लिकेशन से आने वाले ऑडियो को सिर्फ़ तब कैप्चर किया जा सकता है, जब ऐप्लिकेशन इन ज़रूरी शर्तों को पूरा करता हो:
इस्तेमाल
ऑडियो चलाने वाले प्लेयर को इसके इस्तेमाल की जानकारी
USAGE_MEDIA,
USAGE_GAME या
USAGE_UNKNOWN के तौर पर सेट करनी होगी.
डेटा कैप्चर करने से जुड़ी नीति
खिलाड़ी के लिए, वीडियो कैप्चर करने से जुड़ी नीति AudioAttributes.ALLOW_CAPTURE_BY_ALL पर सेट होनी चाहिए. इससे अन्य ऐप्लिकेशन को वीडियो कैप्चर करने की अनुमति मिलती है. ऐसा कई तरीकों से किया जा सकता है:
- सभी खिलाड़ियों के लिए कैप्चर करने की सुविधा चालू करने के लिए, ऐप्लिकेशन की
manifest.xmlफ़ाइल मेंandroid:allowAudioPlaybackCapture="true"शामिल करें. AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)को कॉल करके, सभी प्लेयर पर कैप्चर करने की सुविधा चालू की जा सकती है.AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)का इस्तेमाल करके नीति बनाते समय, किसी खिलाड़ी के लिए नीति सेट की जा सकती है. (अगरAAudioकॉलAAudioStreamBuilder_setAllowedCapturePolicy(AAUDIO_ALLOW_CAPTURE_BY_ALL)का इस्तेमाल किया जा रहा है.)
ये ज़रूरी शर्तें पूरी होने पर, प्लेयर से जनरेट होने वाले किसी भी ऑडियो को कैप्चर किया जा सकता है.
सिस्टम कैप्चर करने की सुविधा बंद करना
ऊपर बताई गई सुरक्षा से जुड़ी सुविधाएं, सिर्फ़ ऐप्लिकेशन के लिए उपलब्ध हैं. Android सिस्टम के कॉम्पोनेंट, डिफ़ॉल्ट रूप से वीडियो चलाने की सुविधा को कैप्चर कर सकते हैं.
इनमें से कई कॉम्पोनेंट को Android वेंडर अपनी ज़रूरत के हिसाब से बनाते हैं. साथ ही, ये सुलभता और कैप्शन जैसी सुविधाओं के साथ काम करते हैं. इसलिए, हमारा सुझाव है कि ऐप्लिकेशन, सिस्टम को अपना कॉन्टेंट चलाने की अनुमति दें. अगर आपको सिस्टम को अपने ऐप्लिकेशन के प्लेबैक को कैप्चर करने की अनुमति नहीं देनी है, तो कैप्चर करने की नीति को ALLOW_CAPTURE_BY_NONE पर सेट करें.
रनटाइम के दौरान नीति सेट करना
ऐप्लिकेशन के चालू होने पर, कैप्चर करने की नीति बदलने के लिए AudioManager.setAllowedCapturePolicy() को कॉल किया जा सकता है. अगर इस तरीके को कॉल करते समय कोई MediaPlayer या AudioTrack चल रहा है, तो ऑडियो पर कोई असर नहीं पड़ता. नीति में हुए बदलाव को लागू करने के लिए, आपको प्लेयर या ट्रैक को बंद करके फिर से खोलना होगा.
नीति = मेनिफ़ेस्ट + AudioManager + AudioAttributes
कैप्चर करने की नीति को कई जगहों पर तय किया जा सकता है. इसलिए, यह समझना ज़रूरी है कि लागू होने वाली नीति कैसे तय की जाती है.
हमेशा सबसे ज़्यादा पाबंदी वाली कैप्चर नीति लागू की जाती है. उदाहरण के लिए, जिस ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में setAllowedCapturePolicy="false" शामिल है वह कभी भी सिस्टम से बाहर के ऐप्लिकेशन को अपना ऑडियो कैप्चर करने की अनुमति नहीं देगा. भले ही, AudioManager#setAllowedCapturePolicy को ALLOW_CAPTURE_BY_ALL पर सेट किया गया हो. इसी तरह, अगर AudioManager#setAllowedCapturePolicy को ALLOW_CAPTURE_BY_ALL पर सेट किया गया है और मेनिफ़ेस्ट setAllowedCapturePolicy="true" सेट करता है, लेकिन मीडिया प्लेयर के AudioAttributes को AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM) के साथ बनाया गया है, तो इस मीडिया प्लेयर को सिस्टम के बाहर के ऐप्लिकेशन कैप्चर नहीं कर पाएंगे.
यहां दी गई टेबल में, मेनिफ़ेस्ट एट्रिब्यूट और लागू नीति के असर के बारे में खास जानकारी दी गई है:
| allowAudioPlaybackCapture | ALLOW_CAPTURE_BY_ALL | ALLOW_CAPTURE_BY_SYSTEM | ALLOW_CAPTURE_BY_NONE |
|---|---|---|---|
| सही | कोई भी ऐप्लिकेशन | सिर्फ़ सिस्टम | कोई कैप्चर नहीं |
| गलत | सिर्फ़ सिस्टम | सिर्फ़ सिस्टम | कोई कैप्चर नहीं |