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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    ऐसा करने से यह पक्का होता है कि फ़ोरग्राउंड सेवा, WIU की सुविधाओं के साथ शुरू हो.

  • अगर 10 मिनट से कम समय के लिए कुछ समय के लिए गड़बड़ियां होती हैं, तो mediaPlayback FGS को चालू रखें.

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

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

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

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

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

बदलावों की टेस्टिंग

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

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

इस कमांड के ये विकल्प हैं:

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

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

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

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

इस्तेमाल के दौरान की सुविधा के साथ FGS को समझना

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

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

यहां काम का रेफ़रंस दिया गया है:

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