ऑडियो इनपुट आम तौर पर, डिवाइस में पहले से मौजूद माइक, बाहरी माइक या डिवाइस से जुड़े ऑडियो इंटरफ़ेस से आता है. ऑडियो इनपुट, फ़ोन पर की गई बातचीत से भी मिल सकता है.
कभी-कभी ऐसा हो सकता है कि दो या इससे ज़्यादा ऐप्लिकेशन, एक ही ऑडियो इनपुट को "कैप्चर" करना चाहें. ऐसा हो सकता है कि वे अलग-अलग टास्क कर रहे हों. उदाहरण के लिए, ऑडियो पाने वाले कुछ ऐप्लिकेशन "रिकॉर्डिंग" कर सकते हैं. जैसे, कोई सामान्य वॉइस रिकॉर्डर. वहीं, कुछ अन्य ऐप्लिकेशन "सुनने" की सुविधा का इस्तेमाल कर सकते हैं. जैसे, Google Assistant या सुलभता सेवा, जो आवाज़ से दिए गए निर्देशों का जवाब देती है.
दोनों ही मामलों में, ये ऐप्लिकेशन ऑडियो इनपुट पाना चाहते हैं. इस पूरे पेज पर, हमने "कैप्चर करना" शब्द का इस्तेमाल किया है. इससे कोई फ़र्क़ नहीं पड़ता कि कोई ऐप्लिकेशन रिकॉर्ड कर रहा है या सिर्फ़ सुन रहा है.
अगर दो या उससे ज़्यादा ऐप्लिकेशन एक ही समय पर ऑडियो कैप्चर करना चाहते हैं, तो हो सकता है कि एक ही सोर्स से सभी ऐप्लिकेशन को ऑडियो सिग्नल देने में समस्या आए. इस पेज पर बताया गया है कि Android सिस्टम, ऑडियो कैप्चर करने वाले कई ऐप्लिकेशन के बीच ऑडियो इनपुट को कैसे शेयर करता है.
Android 10 से पहले के वर्शन में, ऐप्लिकेशन का व्यवहार
Android 10 से पहले, इनपुट ऑडियो स्ट्रीम को एक बार में सिर्फ़ एक ऐप्लिकेशन कैप्चर कर सकता था. अगर कोई ऐप्लिकेशन पहले से ही ऑडियो रिकॉर्ड कर रहा है या सुन रहा है, तो आपका ऐप्लिकेशन AudioRecord ऑब्जेक्ट बना सकता है. हालांकि, AudioRecord.startRecording() को कॉल करने पर गड़बड़ी का मैसेज दिखेगा और रिकॉर्डिंग शुरू नहीं होगी.
हालांकि, इस नियम का एक अपवाद था. जब किसी खास ऐप्लिकेशन (जैसे, Google Assistant या सुलभता सेवा) के पास android.permission.CAPTURE_AUDIO_HOTWORD अनुमति होती थी और वह HOTWORD टाइप के ऑडियो सोर्स का इस्तेमाल करता था. इस मामले में, कोई दूसरा ऐप्लिकेशन रिकॉर्डिंग शुरू कर सकता है. ऐसा होने पर, विशेषाधिकार वाला ऐप्लिकेशन बंद हो जाता है और नया ऐप्लिकेशन इनपुट कैप्चर कर लेता है.
Android 9 में एक और बदलाव किया गया था: सिर्फ़ फ़ोरग्राउंड में चल रहे ऐप्लिकेशन या फ़ोरग्राउंड सेवा ही ऑडियो इनपुट कैप्चर कर सकती थी. जब फ़ोरग्राउंड सेवा या फ़ोरग्राउंड यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट के बिना किसी ऐप्लिकेशन ने ऑडियो कैप्चर करना शुरू किया, तो ऐप्लिकेशन चलता रहा, लेकिन उसे साइलेंस कर दिया गया. भले ही, उस समय सिर्फ़ वही ऐप्लिकेशन ऑडियो कैप्चर कर रहा हो.
Android 10 का व्यवहार
Android 10 से पहले, "पहले आओ, पहले पाओ" के सिद्धांत का पालन किया जाता था. जब कोई ऐप्लिकेशन ऑडियो कैप्चर करना शुरू करता है, तो कोई दूसरा ऐप्लिकेशन ऑडियो इनपुट को तब तक ऐक्सेस नहीं कर सकता, जब तक ऑडियो कैप्चर करने वाला ऐप्लिकेशन बंद नहीं हो जाता.
Android 10 में, प्राथमिकता तय करने की एक ऐसी स्कीम लागू की गई है जो ऐप्लिकेशन के चालू होने पर, इनपुट ऑडियो स्ट्रीम को एक से दूसरे ऐप्लिकेशन पर स्विच कर सकती है. ज़्यादातर मामलों में, अगर कोई नया ऐप्लिकेशन ऑडियो इनपुट ऐक्सेस करता है, तो ऑडियो रिकॉर्ड करने वाला पिछला ऐप्लिकेशन चलता रहता है, लेकिन उसे कोई आवाज़ नहीं मिलती. कुछ मामलों में, सिस्टम दोनों ऐप्लिकेशन पर ऑडियो डिलीवर करना जारी रख सकता है. शेयर करने के अलग-अलग तरीकों के बारे में यहां बताया गया है.
यह स्कीम, ऑडियो फ़ोकस की तरह ही काम करती है. ऑडियो फ़ोकस, ऑडियो आउटपुट के लिए कई ऐप्लिकेशन को मैनेज करता है. हालांकि, ऑडियो फ़ोकस को प्रोग्राम के हिसाब से मैनेज किया जाता है. इसके लिए, फ़ोकस पाने और छोड़ने के अनुरोध किए जाते हैं. वहीं, यहां बताई गई इनपुट स्विच करने की स्कीम, प्राथमिकता तय करने की नीति पर आधारित होती है. यह नीति, किसी नए ऐप्लिकेशन के ऑडियो कैप्चर करने पर अपने-आप लागू हो जाती है.
ऑडियो कैप्चर करने के लिए, Android दो तरह के ऐप्लिकेशन में अंतर करता है:
- "सामान्य" ऐप्लिकेशन को उपयोगकर्ता इंस्टॉल करते हैं.
- "खास अधिकार वाले" ऐप्लिकेशन, डिवाइस पर पहले से इंस्टॉल होते हैं. इनमें Google Assistant और सुलभता से जुड़ी सभी सेवाएं शामिल हैं.
इसके अलावा, अगर कोई ऐप्लिकेशन "निजता के लिहाज़ से संवेदनशील" ऑडियो सोर्स का इस्तेमाल करता है, तो उसे अलग तरीके से ट्रीट किया जाता है:
CAMCORDER
या VOICE_COMMUNICATION.
ऑडियो इनपुट का इस्तेमाल करने और उसे शेयर करने के लिए, प्राथमिकता से जुड़े ये नियम लागू होते हैं:
- खास ऐप्लिकेशन को सामान्य ऐप्लिकेशन से ज़्यादा प्राथमिकता दी जाती है.
- फ़ोरग्राउंड में दिखने वाले यूज़र इंटरफ़ेस (यूआई) वाले ऐप्लिकेशन को, बैकग्राउंड में चल रहे ऐप्लिकेशन से ज़्यादा प्राथमिकता दी जाती है.
- निजता के लिहाज़ से संवेदनशील सोर्स से ऑडियो कैप्चर करने वाले ऐप्लिकेशन को, ऐसा न करने वाले ऐप्लिकेशन की तुलना में ज़्यादा प्राथमिकता दी जाती है.
- दो सामान्य ऐप्लिकेशन, एक ही समय पर ऑडियो कैप्चर नहीं कर सकते.
- कुछ स्थितियों में, खास अधिकारों वाला ऐप्लिकेशन, ऑडियो इनपुट को किसी दूसरे ऐप्लिकेशन के साथ शेयर कर सकता है.
- अगर एक ही प्राथमिकता वाले दो बैकग्राउंड ऐप्लिकेशन ऑडियो कैप्चर कर रहे हैं, तो सबसे आखिर में शुरू किए गए ऐप्लिकेशन को ज़्यादा प्राथमिकता दी जाएगी.
शेयर करने से जुड़ी स्थितियां
जब दो ऐप्लिकेशन ऑडियो कैप्चर करने की कोशिश करते हैं, तो हो सकता है कि दोनों को इनपुट सिग्नल मिले या उनमें से किसी एक को कोई सिग्नल न मिले.
इसके चार मुख्य उदाहरण हैं:
- Assistant + सामान्य ऐप्लिकेशन
- सुलभता सेवा + सामान्य ऐप्लिकेशन
- दो सामान्य ऐप्लिकेशन
- वॉइस कॉल + सामान्य ऐप्लिकेशन
Assistant + सामान्य ऐप्लिकेशन
Assistant एक खास ऐप्लिकेशन है, क्योंकि यह पहले से इंस्टॉल होता है और इसके पास RoleManager.ROLE_ASSISTANT की भूमिका होती है.
इस भूमिका वाले किसी भी अन्य ऐप्लिकेशन को इसी तरह से माना जाता है.
Android, इन नियमों के मुताबिक इनपुट ऑडियो शेयर करता है:
Assistant को ऑडियो मिल सकता है. इससे कोई फ़र्क़ नहीं पड़ता कि वह फ़ोरग्राउंड में है या बैकग्राउंड में. हालांकि, ऐसा तब तक होता है, जब तक कोई दूसरा ऐप्लिकेशन निजता से जुड़े ऑडियो सोर्स का इस्तेमाल करके ऑडियो कैप्चर न कर रहा हो.
जब तक Assistant के पास स्क्रीन पर सबसे ऊपर दिखने वाला यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट नहीं होता, तब तक ऐप्लिकेशन को ऑडियो मिलता रहता है.
ध्यान दें कि दोनों ऐप्लिकेशन को ऑडियो सिर्फ़ तब मिलता है, जब Assistant बैकग्राउंड में चल रही हो और दूसरा ऐप्लिकेशन, निजता के लिहाज़ से संवेदनशील ऑडियो सोर्स से डेटा कैप्चर न कर रहा हो.
सुलभता सेवा + सामान्य ऐप्लिकेशन
AccessibilityService के लिए, एलान करना ज़रूरी है.
Android, इन नियमों के मुताबिक इनपुट ऑडियो शेयर करता है:
अगर सेवा का यूज़र इंटरफ़ेस (यूआई) सबसे ऊपर है, तो सेवा और ऐप्लिकेशन, दोनों को ऑडियो इनपुट मिलता है. इस सुविधा की मदद से, बोलकर वॉइस कॉल या वीडियो कैप्चर को कंट्रोल किया जा सकता है.
अगर सेवा सबसे ऊपर नहीं है, तो इस मामले को नीचे दिए गए सामान्य दो ऐप्लिकेशन के मामले की तरह माना जाता है.
दो सामान्य ऐप्लिकेशन
जब दो ऐप्लिकेशन एक साथ ऑडियो कैप्चर करते हैं, तो सिर्फ़ एक ऐप्लिकेशन को ऑडियो मिलता है और दूसरे को कोई आवाज़ नहीं मिलती.
Android, इन नियमों के मुताबिक इनपुट ऑडियो शेयर करता है:
- अगर दोनों ऐप्लिकेशन में निजता से जुड़ी जानकारी नहीं है, तो सबसे ऊपर मौजूद यूज़र इंटरफ़ेस (यूआई) वाले ऐप्लिकेशन को ऑडियो मिलेगा. अगर दोनों ऐप्लिकेशन में यूज़र इंटरफ़ेस (यूआई) नहीं है, तो ऑडियो उस ऐप्लिकेशन को मिलेगा जिसने हाल ही में ऑडियो कैप्चर करना शुरू किया है.
- अगर कोई ऐप्लिकेशन निजता के लिहाज़ से संवेदनशील है, तो उसे ऑडियो मिलता है. वहीं, दूसरे ऐप्लिकेशन को ऑडियो नहीं मिलता. भले ही, उसका यूज़र इंटरफ़ेस (यूआई) सबसे ऊपर हो या उसने हाल ही में ऑडियो कैप्चर करना शुरू किया हो.
- अगर दोनों ऐप्लिकेशन में निजता से जुड़ी जानकारी होती है, तो जिस ऐप्लिकेशन ने हाल ही में ऑडियो कैप्चर करना शुरू किया है उसे ऑडियो मिलता है और दूसरे ऐप्लिकेशन को ऑडियो नहीं मिलता.
वॉइस कॉल + सामान्य ऐप्लिकेशन
अगर AudioManager.getMode() से मिला ऑडियो मोड MODE_IN_CALL या MODE_IN_COMMUNICATION है, तो इसका मतलब है कि वॉइस कॉल चालू है.
Android, इन नियमों के मुताबिक इनपुट ऑडियो शेयर करता है:
- कॉल में हमेशा ऑडियो मिलता है.
- अगर ऐप्लिकेशन, सुलभता सेवा है, तो वह ऑडियो कैप्चर कर सकता है.
अगर ऐप्लिकेशन को
CAPTURE_AUDIO_OUTPUTअनुमति मिली है और वह खास (पहले से इंस्टॉल) ऐप्लिकेशन है, तो वह वॉइस कॉल को कैप्चर कर सकता है.आवाज़ वाली कॉल के अपलिंक (TX), डाउनलिंक (RX) या दोनों को कैप्चर करने के लिए, ऐप्लिकेशन को ऑडियो सोर्स
MediaRecorder.AudioSource.VOICE_UPLINKयाMediaRecorder.AudioSource.VOICE_DOWNLINKऔर/या डिवाइसAudioDeviceInfo.TYPE_TELEPHONYके बारे में बताना होगा.
Android 11 का व्यवहार
Android 11 (एपीआई लेवल 30), ऊपर बताई गई Android 10 की प्राथमिकता वाली स्कीम का पालन करता है. यह AudioRecord, MediaRecorder, और AAudioStream में नए तरीके भी उपलब्ध कराता है. इनसे एक साथ ऑडियो कैप्चर करने की सुविधा को चालू और बंद किया जा सकता है. भले ही, इस्तेमाल का कोई भी तरीका चुना गया हो.
नए तरीके ये हैं:
AudioRecord.Builder.setPrivacySensitive()AudioRecord.isPrivacySensitive()MediaRecorder.setPrivacySensitive()MediaRecorder.isPrivacySensitive()AAudioStreamBuilder_setPrivacySensitive()AAudioStream_isPrivacySensitive()
जब setPrivacySensitive() की स्थिति true होती है, तो कैप्चर करने की सुविधा निजी होती है. यहां तक कि, खास अधिकार वाली Assistant भी एक साथ कैप्चर नहीं कर सकती. यह सेटिंग, ऑडियो सोर्स के हिसाब से डिफ़ॉल्ट रूप से काम करने वाले तरीके को बदल देती है. उदाहरण के लिए, VOICE_COMMUNICATION डिफ़ॉल्ट रूप से निजी होता है, लेकिन UNPROCESSED नहीं.
कॉन्फ़िगरेशन में बदलाव
जब कई ऐप्लिकेशन एक साथ ऑडियो कैप्चर कर रहे होते हैं, तो उनमें से सिर्फ़ एक या दो "चालू" होते हैं (ऑडियो पाते हैं); बाकी म्यूट होते हैं (कोई ऑडियो नहीं मिलता). जब चालू ऐप्लिकेशन बदलते हैं, तो ऑडियो फ़्रेमवर्क इन नियमों के मुताबिक ऑडियो पाथ को फिर से कॉन्फ़िगर कर सकता है:
- हर चालू ऐप्लिकेशन के लिए, ऑडियो इनपुट डिवाइस बदल सकता है. उदाहरण के लिए, बिल्ट-इन माइक्रोफ़ोन से कनेक्ट किए गए ब्लूटूथ हेडसेट पर स्विच किया जा सकता है.
- सबसे ज़्यादा प्राथमिकता वाले चालू ऐप्लिकेशन से जुड़ी प्रीप्रोसेसिंग चालू है. अन्य सभी प्रीप्रोसेसिंग को अनदेखा कर दिया जाता है.
ज़्यादा प्राथमिकता वाला ऐप्लिकेशन चालू होने पर, चालू ऐप्लिकेशन को बंद किया जा सकता है. इसलिए, कॉन्फ़िगरेशन में बदलाव होने पर सूचना पाने के लिए, AudioRecord या MediaRecorder ऑब्जेक्ट पर AudioManager.AudioRecordingCallback रजिस्टर किया जा सकता है.
ये बदलाव हो सकते हैं:
- कैप्चर करने की सुविधा बंद या चालू की गई हो
- डिवाइस बदला गया
- प्रीप्रोसेसिंग में बदलाव किया गया
- स्ट्रीम की प्रॉपर्टी में बदलाव किया गया है (सैंपलिंग रेट, चैनल मास्क, सैंपल फ़ॉर्मैट)
कैप्चर शुरू होने से पहले, आपको AudioRecord.registerAudioRecordingCallback() को कॉल करना होगा.
कॉल बैक सिर्फ़ तब लागू होता है, जब ऐप्लिकेशन को ऑडियो मिल रहा हो और उसमें कोई बदलाव हो.
onRecordingConfigChanged() वाला तरीका, AudioRecordingConfiguration ऑब्जेक्ट दिखाता है. इसमें ऑडियो कैप्चर करने की मौजूदा स्थिति होती है. बदलाव के बारे में जानने के लिए, यहां दिए गए तरीकों का इस्तेमाल करें:
isClientSilenced()- अगर कैप्चर करने की नीति की वजह से, क्लाइंट को वापस भेजा गया ऑडियो फ़िलहाल बंद है, तो यह फ़ंक्शन सही वैल्यू दिखाता है.
getAudioDevice()- यह फ़ंक्शन, ऐक्टिव ऑडियो डिवाइस की जानकारी देता है.
getEffects()- यह फ़ंक्शन, प्रीप्रोसेसिंग के चालू इफ़ेक्ट को दिखाता है. ध्यान दें कि अगर क्लाइंट, सबसे ज़्यादा प्राथमिकता वाला ऐक्टिव ऐप्लिकेशन नहीं है, तो हो सकता है कि ऐक्टिव इफ़ेक्ट,
getClientEffects()से मिले इफ़ेक्ट से अलग हो. getFormat()- यह स्ट्रीम की प्रॉपर्टी दिखाता है. ध्यान दें कि क्लाइंट को मिलने वाला असली ऑडियो डेटा, हमेशा
getClientFormat()से मिले ज़रूरी फ़ॉर्मैट के मुताबिक होता है. फ़्रेमवर्क, हार्डवेयर इंटरफ़ेस पर इस्तेमाल किए गए फ़ॉर्मैट से लेकर क्लाइंट की ओर से तय किए गए फ़ॉर्मैट तक, ज़रूरी रीसैंपलिंग, चैनल, और फ़ॉर्मैट कन्वर्ज़न अपने-आप करता है. AudioRecord.getActiveRecordingConfiguration().- इससे, चालू रिकॉर्डिंग कॉन्फ़िगरेशन मिलता है.
AudioManager.getActiveRecordingConfigurations() बोलकर, डिवाइस पर चालू सभी रिकॉर्डिंग की सामान्य जानकारी पाई जा सकती है.