कोई ऐप्लिकेशन, किसी दूसरे ऐप्लिकेशन से चलाए जा रहे वीडियो या ऑडियो को रिकॉर्ड कर सकता है. ऐसे ऐप्लिकेशन को MediaProjection टोकन को सही तरीके से मैनेज करना होगा. इस पेज पर, यह बताया गया है कि कैसे: इसमें यह भी बताया गया है कि डिवाइस एडमिन, स्क्रीनशॉट रिकॉर्ड करने की सुविधा को कैसे बंद कर सकता है. साथ ही, कोई ऑडियो ऐप्लिकेशन, दूसरे ऐप्लिकेशन को अपना कॉन्टेंट रिकॉर्ड करने से कैसे रोक सकता है.
MediaProjection टोकन को मैनेज करने का तरीका
MediaProjection API
की मदद से, ऐप्लिकेशन को MediaProjection टोकन मिलता है. इससे उन्हें स्क्रीन पर मौजूद कॉन्टेंट या ऑडियो को कैप्चर करने के लिए, एक बार का ऐक्सेस मिलता है. Android OS, आपके ऐप्लिकेशन को टोकन देने से पहले उपयोगकर्ता से अनुमति मांगता है.
ओएस, क्विक सेटिंग के यूज़र इंटरफ़ेस (यूआई) में चालू MediaProjection टोकन दिखाता है. साथ ही, उपयोगकर्ताओं को किसी भी समय टोकन का ऐक्सेस वापस लेने की अनुमति देता है. ऐसा होने पर, सेशन से जुड़े वर्चुअल डिसप्ले या ऑडियो स्ट्रीम को मीडिया स्ट्रीम मिलना बंद हो जाता है. आपके ऐप्लिकेशन को सही तरीके से जवाब देना होगा. ऐसा न करने पर, वह ऑडियो साइलेंस या ब्लैक वीडियो स्ट्रीम रिकॉर्ड करता रहेगा.
टोकन के खो जाने की समस्या को मैनेज करने के लिए, MediaProjection इंस्टेंस पर कॉलबैक रजिस्टर करें. इसके लिए, registerCallback तरीके का इस्तेमाल करें. साथ ही, onStop तरीके को कॉल किए जाने पर रिकॉर्डिंग बंद करें.
ज़्यादा जानकारी के लिए, मीडिया प्रोजेक्शन लेख पढ़ें.
वीडियो कैप्चर करें
डिवाइस की स्क्रीन को रीयल टाइम में कैप्चर करने और उसे SurfaceView पर दिखाने के लिए, Media Projection API का इस्तेमाल करने का तरीका जानने के लिए, ScreenCapture सैंपल ऐप्लिकेशन देखें.
स्क्रीन रिकॉर्डिंग को रोकने के लिए, 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पर पास करें.
ऑडियो कैप्चर करने की सुविधा को कंट्रोल करना
आपका ऐप्लिकेशन यह कंट्रोल कर सकता है कि वह किस तरह के कॉन्टेंट को रिकॉर्ड कर सकता है. साथ ही, यह भी कंट्रोल कर सकता है कि किस तरह के अन्य ऐप्लिकेशन, उसके कॉन्टेंट को रिकॉर्ड कर सकते हैं.
ऑडियो कॉन्टेंट के हिसाब से कैप्चर करने की सुविधा को सीमित करना
कोई ऐप्लिकेशन इन तरीकों का इस्तेमाल करके, यह तय कर सकता है कि उसे कौनसी आवाज़ कैप्चर करनी है:
- किसी खास इस्तेमाल को कैप्चर करने की अनुमति देने के लिए,
AUDIO_USAGEको AudioPlaybackCaptureConfiguration.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 |
|---|---|---|---|
| true | कोई भी ऐप्लिकेशन | सिर्फ़ सिस्टम | कोई कैप्चर नहीं |
| गलत | सिर्फ़ सिस्टम | सिर्फ़ सिस्टम | कोई कैप्चर नहीं |