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