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

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

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

अगर ऐप्लिकेशन, ऑडियो एपीआई को कॉल करने की कोशिश करता है, जबकि ऐप्लिकेशन मान्य लाइफ़साइकल में नहीं है, तो ऑडियो चलाने और वॉल्यूम बदलने वाले एपीआई बिना किसी अपवाद के या गड़बड़ी का मैसेज दिए बिना काम नहीं करते. ऑडियो फ़ोकस एपीआई, 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 16 और Android 17 पर किए गए बदलावों की जांच करना

यह सुविधा, Android 16 और इसके बाद के वर्शन में "चेतावनी" लेवल पर पहले से ही लागू है. इसका मतलब है कि ऐप्लिकेशन, बैकग्राउंड ऑडियो को बेहतर बनाने से जुड़ी नीति के उल्लंघन को मैन्युअल तरीके से टेस्ट करने के लिए, adb shell cmd audio set-enable-hardening का इस्तेमाल कर सकते हैं.

Android 16 पर चल रहे डिवाइसों पर, नीति लागू करने की सुविधा चालू करने के लिए, यह कमांड चलाएं:

adb shell cmd audio set-enable-hardening 1

Android 17 पर चल रहे डिवाइसों पर, नीति लागू करने की सुविधा बंद करने के लिए, यह कमांड चलाएं:

adb shell cmd audio set-enable-hardening 0

हमारा यह भी सुझाव है कि logcat या adb कमांड adb dumpsys audio का इस्तेमाल करके, यह पता लगाएं कि ऑडियो हार्डनिंग लागू होने की वजह से, ऐप्लिकेशन में कोई समस्या तो नहीं आई. अगर ऐसा हुआ है, तो लॉग में AudioHardening से शुरू होने वाली एक एंट्री होगी. इसमें आपके पैकेज का नाम होगा.

डिवाइस के इस्तेमाल के दौरान एफ़जीएस की सुविधा के बारे में जानकारी

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

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

यहां काम की जानकारी दी गई है:

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

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

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

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

नतीजा

जिन एपीआई पर असर पड़ा है

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

वीडियो का साउंड बंद हो जाता है

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

AudioTrack.write()

(एनडीके) 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()