बैकग्राउंड ऑडियो को बेहतर बनाना

Android 17 से, ऑडियो फ़्रेमवर्क बैकग्राउंड में ऑडियो इंटरैक्शन पर पाबंदियां लागू करता है. इनमें ऑडियो प्लेबैक, ऑडियो फ़ोकस के अनुरोध, और आवाज़ बदलने वाले एपीआई शामिल हैं. इससे यह पक्का किया जाता है कि ये बदलाव, उपयोगकर्ता की अनुमति से ही शुरू किए गए हों.

Android 17 पर चलने वाले ऐसे सभी ऐप्लिकेशन जिनमें बैकग्राउंड में ऑडियो इंटरैक्शन की ये सुविधाएं मौजूद हैं उनके लिए ज़रूरी है कि वे कोई ऐसी गतिविधि दिखाएं जो साफ़ तौर पर दिख रही हो या कोई ऐसी फ़ोरग्राउंड सेवा चलाएं जो SHORT_SERVICE टाइप की न हो. यह नीति तब भी लागू होती है, जब ऐप्लिकेशन एपीआई लेवल 37 को टारगेट न करता हो.

अगर कोई ऐप्लिकेशन Android 17 (एपीआई लेवल 37) को टारगेट करता है, तो उस पर एक और पाबंदी लागू होती है. अगर ऐप्लिकेशन बैकग्राउंड में चल रहा है, तो उसे ऐसी फ़ोरग्राउंड सेवा चलानी होगी जिसमें इस्तेमाल के दौरान (डब्ल्यूआईयू) वाली सुविधाएं हों. (अगर फ़ोरग्राउंड सेवा को उपयोगकर्ता की ओर से शुरू की गई किसी कार्रवाई के जवाब में शुरू किया जाता है या जब ऐप्लिकेशन उपयोगकर्ता को दिखता है, तो उसे डब्ल्यूआईयू की सुविधाएं दी जाती हैं.) हालांकि, अगर ऐप्लिकेशन को एग्ज़ैक्ट अलार्म की अनुमति दी गई है, तो WIU की सुविधाओं की ज़रूरत नहीं होती. साथ ही, यह उन ऑडियो स्ट्रीम में बदलाव करता है जिनमें USAGE_ALARM एट्रिब्यूट मौजूद होता है.

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

हम यह बदलाव क्यों कर रहे हैं

इन पाबंदियों को लागू करने का मकसद, बैकग्राउंड में ऑडियो चलने की सुविधा से जुड़ी गड़बड़ियों को कम करना है. कुछ उदाहरण ये हैं:

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

हम डेवलपर को अपने ऐप्लिकेशन की जांच करने और व्यवहार में हुए बदलाव के बारे में सुझाव देने के लिए बढ़ावा देते हैं. ऐसा तब किया जाता है, जब ऑडियो के इस्तेमाल के किसी मामले पर नकारात्मक असर पड़ा हो. कृपया किसी भी समस्या की शिकायत करने के लिए, Android 17 के साथ ऐप्लिकेशन के काम करने से जुड़ी समस्या को ट्रैक करने वाले टूल का इस्तेमाल करें.

बैकग्राउंड ऑडियो के इस्तेमाल के उन उदाहरणों की पहचान करना जिन पर असर पड़ा है

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

अगर आपके ऐप्लिकेशन का मकसद सिर्फ़ ऑडियो चलाना या ऑडियो एपीआई का इस्तेमाल करना है, तो इन बदलावों का उस पर कोई असर नहीं पड़ेगा. हालांकि, इसके लिए ज़रूरी है कि ऐप्लिकेशन उपयोगकर्ता को दिखने वाली कोई गतिविधि दिखा रहा हो. इसमें पिक्चर में पिक्चर (पीआईपी) मोड का इस्तेमाल करना भी शामिल है.

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

अगर आपके ऐप्लिकेशन को स्क्रीन बंद होने पर या ऐप्लिकेशन की गतिविधि न दिखने पर भी ऑडियो चलाना जारी रखना है, तो उसे नई ज़रूरी शर्तें पूरी करनी होंगी. ऐसा आम तौर पर, संगीत स्ट्रीमिंग ऐप्लिकेशन या पॉडकास्ट ऐप्लिकेशन में देखा जाता है. ऐसे ऐप्लिकेशन को बैकग्राउंड में ऑडियो चलाने की सुविधा देने वाला ऐप्लिकेशन माना जाता है.

बैकग्राउंड ऑडियो से जुड़ी ऐसी स्थितियां जिन पर असर पड़ सकता है

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

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

बैकग्राउंड ऑडियो के असर को कम करने के सबसे सही तरीके

  • बैकग्राउंड में ऑडियो चलाने की सुविधा को मैनेज करने के लिए, media3 jetpack लाइब्रेरी के MediaSessionService कॉम्पोनेंट का इस्तेमाल करें.

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

  • अगर Media3 लाइब्रेरी का इस्तेमाल नहीं किया जा रहा है, तो आपको mediaPlayback एफ़जीएस को मैन्युअल तरीके से शुरू करना होगा. अगर बैकग्राउंड में ऑडियो चल सकता है, तो ऐप्लिकेशन के फ़ोरग्राउंड में होने पर ही फ़ोरग्राउंड सेवा शुरू करें.

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

    इससे यह पक्का होता है कि फ़ोरग्राउंड सेवा, डब्ल्यूआईयू की सुविधाओं के साथ शुरू हो.

  • 10 मिनट से कम समय के लिए होने वाली अस्थायी गड़बड़ियों के दौरान, mediaPlayback एफ़जीएस को चालू रखें.

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

  • प्लेबैक खत्म होने पर, फ़ोरग्राउंड सेवा को बंद कर दें. साथ ही, प्लेबैक को सिर्फ़ तब रीस्टार्ट करें, जब उपयोगकर्ता साफ़ तौर पर प्लेबैक को फिर से शुरू करे.

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

    इसके बाद, अगर उपयोगकर्ता साफ़ तौर पर प्लेबैक फिर से शुरू करता है, तो ऑडियो प्लेबैक शुरू करने का इंटेंट वापस आ जाना चाहिए. इससे एक नया एफ़जीएस शुरू हो जाएगा. उदाहरण के लिए, आपके ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) या यूनिवर्सल मीडिया ऑब्जेक्ट के 'चलाएं' बटन के ज़रिए.

  • adb शेल कमांड की मदद से, ऑडियो प्लेबैक के काम करने के तरीके की जांच करें.

बदलावों की जांच करना

Android 17 या इसके बाद के वर्शन (बीटा 3 से शुरू होने वाले वर्शन) पर चलने वाले ऐप्लिकेशन के लिए, यह जांच की जा सकती है कि आपका ऐप्लिकेशन इस नीति का पालन करता है या नहीं. इसके लिए, यहां दिया गया ADB कमांड चलाएं:

adb shell cmd audio set-enable-hardening <enable|disable|throw>

इस निर्देश के लिए ये विकल्प उपलब्ध हैं:

  • enable: इससे सभी ऐप्लिकेशन के लिए, ऑडियो को सुरक्षित करने से जुड़ी सभी पाबंदियां चालू हो जाती हैं. WIU फ़ोरग्राउंड सेवाओं की ज़रूरी शर्त तब भी लागू होती है, जब कोई ऐप्लिकेशन Android 17 (एपीआई लेवल 37) को टारगेट करता हो या नहीं. इसके अलावा, यह ज़रूरी शर्त तब भी लागू होती है, जब ऐप्लिकेशन अलार्म स्ट्रीम में बदलाव कर रहा हो और उसके पास एग्ज़ैक्ट अलार्म की अनुमति हो.

  • disable: ऑडियो को बेहतर बनाने से जुड़ी सभी पाबंदियों को बंद करता है.

  • throw: इससे सभी ऐप्लिकेशन के लिए, ऑडियो को सुरक्षित रखने से जुड़ी सभी पाबंदियां चालू हो जाती हैं. जैसे, enable. इसके अलावा, यह फ़्लैग आवाज़ और फ़ोकस इंटरैक्शन के लिए, IllegalStateException को थ्रो करके, तेज़ आवाज़ में होने वाली गड़बड़ियों को चालू करता है. ऑडियो चलाने के लिए, राइट मेथड लगातार गड़बड़ी का कोड दिखाता है. अगर साफ़ तौर पर लिखे बिना प्लेबैक मोड का इस्तेमाल किया जाता है, तो ऐप्लिकेशन क्रैश हो जाता है.

adb dumpsys audio या logcat का इस्तेमाल करके, यह पता लगाएं कि ऑडियो हार्डनिंग की नीति लागू होने की वजह से, ऐप्लिकेशन में साइलेंट फ़ेलियर की समस्या आई है या नहीं. अगर ऐसा हुआ है, तो आपके पैकेज के नाम के साथ AudioHardening से शुरू होने वाली एक एंट्री होगी. अगर मैसेज में level: full शामिल है, तो इसका मतलब है कि आपका ऐप्लिकेशन फ़ोरग्राउंड सेवा चला रहा है. हालांकि, इस सेवा में, ऐप्लिकेशन इस्तेमाल करने के दौरान जगह की जानकारी ऐक्सेस करने की सुविधा नहीं है. अगर मैसेज में level: partial शामिल है, तो इसका मतलब है कि आपका ऐप्लिकेशन फ़ोरग्राउंड सेवा का इस्तेमाल नहीं कर रहा है.

'इस्तेमाल के दौरान' सुविधा के साथ एफ़जीएस को समझना

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

डब्ल्यूआईयू, सुरक्षा गेट की तरह काम करता है. यह बैकग्राउंड में शुरू की गई एफ़जीएस को कुछ संवेदनशील गतिविधियों में शामिल होने से रोकता है. ऐसा तब होता है, जब उपयोगकर्ता को ऐप्लिकेशन की गतिविधि के बारे में जानकारी न हो. यह ऐप्लिकेशन को जगह की जानकारी, कैमरा या माइक्रोफ़ोन जैसे संवेदनशील डेटा को ऐक्सेस करने से रोकता है. साथ ही, Android 17 से यह उन ऑडियो एपीआई को भी ब्लॉक करता है जिनके लिए आम तौर पर, यूज़र इंटरफ़ेस (यूआई) के कॉन्टेक्स्ट की ज़रूरत होती है.

यहां कुछ ज़रूरी जानकारी दी गई है:

  • स्टैंडर्ड एफ़जीएस: ऐप्लिकेशन के दिखने के दौरान शुरू की गई सेवाओं या बैकग्राउंड में गतिविधि लॉन्च करने की सुविधा को डब्ल्यूआईयू ऐक्सेस दिया जाता है.
  • बैकग्राउंड में शुरू की गई एफ़जीएस (बीएफ़एसएल): इनमें से ज़्यादातर एफ़जीएस, डब्ल्यूआईयू को ऐक्सेस करने की अनुमति नहीं देती हैं. मुख्य अपवाद, जिनके तहत WIU की अनुमति दी जाती है. इनमें ऐसे इंटरैक्शन शामिल हैं जिनमें उपयोगकर्ता का मकसद साफ़ तौर पर ज़ाहिर होता है. उदाहरण के लिए, सूचना पर क्लिक करना, विजेट से इंटरैक्शन करना या किसी बाहरी डिवाइस से मीडिया बटन इवेंट.
  • सिस्टम से शुरू की गई एफ़जीएस: फ़ोरग्राउंड सेवाओं को डब्ल्यूआईयू का ऐक्सेस तब मिलता है, जब उन्हें सिस्टम-सर्वर डेलिगेशन (उदाहरण के लिए, Telecom Jetpack लाइब्रेरी से) या सिस्टम बाइंडिंग से शुरू किया जाता है. सिस्टम बाइंडिंग, किसी खास फ़ंक्शन को पूरा करने के लिए, फ़ोरग्राउंड की बेहतर स्थिति को दिखाती है. जैसे, VoiceInteractionService के लिए.

बैकग्राउंड से फ़ोरग्राउंड सर्विस शुरू करने पर पाबंदियां में ज़्यादा पढ़ें.

उन सभी ऑडियो एपीआई की सूची जिन पर असर पड़ा है

ऑडियो फ़ंक्शन

नतीजा

असर वाले एपीआई

ऑडियो प्लेबैक

वीडियो की आवाज़ बंद हो जाती है

कोई अपवाद नहीं है. किसी भी एपीआई ने गड़बड़ी का कोई मैसेज नहीं दिया है

AudioTrack.write()

(NDK) AAudioStream_write

Android के लिए OpenSL ES

Media3, Exoplayer, और Oboe जैसी क्लाइंट साइड मीडिया लाइब्रेरी पर भी इसका असर पड़ सकता है.

ऑडियो फ़ोकस का अनुरोध

AUDIOFOCUS_REQUEST_FAILED दिखाता है

दूसरे ऐप्लिकेशन के ऑडियो प्लेबैक पर कोई असर नहीं पड़ा, फ़ोकस नहीं मिला

AudioManager.requestAudioFocus()

वॉल्यूम और रिंगर मोड एपीआई

रिंगर मोड या आवाज़ पर कोई असर नहीं पड़ता (कॉल करने के तरीके को चुपचाप अनदेखा कर दिया जाता है)

कोई अपवाद नहीं है. किसी भी एपीआई ने गड़बड़ी का कोई मैसेज नहीं दिया है

AudioManager.setStreamVolume()

AudioManager.setStreamMute()

AudioManager.adjustStreamVolume()

AudioManager.adjustVolume()

AudioManager.adjustSuggestedStreamVolume()

AudioManager.setRingerMode()