ऑडियो आउटपुट में होने वाले बदलावों को मैनेज करना

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

वॉल्यूम कंट्रोल का इस्तेमाल करना

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

Android, संगीत, अलार्म, सूचनाओं, आने वाले कॉल की रिंग, सिस्टम की आवाज़ों, कॉल के दौरान की जाने वाली आवाज़ों, और डीटीएमएफ़ टोन चलाने के लिए, अलग-अलग ऑडियो स्ट्रीम का इस्तेमाल करता है. इससे उपयोगकर्ता, हर स्ट्रीम का वॉल्यूम अलग-अलग कंट्रोल कर सकते हैं.

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

अगर आपका ऐप्लिकेशन अलार्म घड़ी नहीं है, तो आपको ऑडियो को इस्तेमाल के लिए अनुमति AudioAttributes.USAGE_MEDIA के साथ चलाना चाहिए.

यह पक्का करने के लिए कि वॉल्यूम कंट्रोल सही स्ट्रीम को अडजस्ट करें, आपको setVolumeControlStream() को कॉल करना चाहिए. साथ ही, अपने एट्रिब्यूट से मैच करने वाले स्ट्रीम टाइप को पास करना चाहिए. इन एट्रिब्यूट को AudioAttributes.getVolumeControlStream से वापस पाया जा सकता है.

Kotlin

setVolumeControlStream(AudioManager.STREAM_MUSIC)

Java

setVolumeControlStream(AudioManager.STREAM_MUSIC);

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

प्रोग्राम के हिसाब से स्ट्रीम का वॉल्यूम कंट्रोल करना

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

तय वॉल्यूम वाले डिवाइसों के साथ काम करना

कुछ डिवाइसों (जैसे, Chromebook और Android Automotive OS वाली गाड़ियां) में वॉल्यूम कंट्रोल होते हैं. हालांकि, ऐप्लिकेशन इन डिवाइसों पर ऑडियो स्ट्रीम का लेवल बदलने के लिए, पहले बताए गए AudioManager तरीकों का इस्तेमाल नहीं कर सकते. इन्हें वॉल्यूम में बदलाव न करने वाले डिवाइस कहा जाता है. isVolumeFixed() को कॉल करके, यह पता लगाया जा सकता है कि आपका ऐप्लिकेशन, वॉल्यूम में बदलाव न करने की सुविधा वाले डिवाइस पर चल रहा है या नहीं.

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

खिलाड़ी Method
AudioTrack AudioTrack.setVolume()
MediaPlayer MediaPlayer.setVolume()
ExoPlayer SimpleExoPlayer.setVolume() का इस्तेमाल करें, जो मौजूदा AudioTrack का वॉल्यूम सेट करता है.
वेब HTMLMediaElement की volume प्रॉपर्टी सेट करें

शोर न करें

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

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

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

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

Kotlin

private class BecomingNoisyReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        if (intent.action == AudioManager.ACTION_AUDIO_BECOMING_NOISY) {
            // Pause the playback
        }
    }
}

Java

private class BecomingNoisyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
      if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {
          // Pause the playback
      }
    }
}

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

Kotlin

private val intentFilter = IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY)
private val myNoisyAudioStreamReceiver = BecomingNoisyReceiver()

private val callback = object : MediaSessionCompat.Callback() {

    override fun onPlay() {
        registerReceiver(myNoisyAudioStreamReceiver, intentFilter)
    }

    override fun onStop() {
        unregisterReceiver(myNoisyAudioStreamReceiver)
    }
}

Java

private IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
private BecomingNoisyReceiver myNoisyAudioStreamReceiver = new BecomingNoisyReceiver();

MediaSessionCompat.Callback callback = new
MediaSessionCompat.Callback() {
  @Override
  public void onPlay() {
    registerReceiver(myNoisyAudioStreamReceiver, intentFilter);
  }

  @Override
  public void onStop() {
    unregisterReceiver(myNoisyAudioStreamReceiver);
  }
}