অডিও আউটপুটে পরিবর্তন ম্যানেজ করা

ব্যবহারকারীরা আশা করেন যে তারা অডিও অ্যাপের ভলিউম নিয়ন্ত্রণ করতে পারবেন। স্ট্যান্ডার্ড আচরণের মধ্যে ভলিউম কন্ট্রোল ব্যবহার করার ক্ষমতা (ডিভাইসের বোতাম বা নব বা UI-তে স্লাইডার) এবং ব্যবহার করার সময় হেডফোনের মতো পেরিফেরাল ডিসকানেক্ট হয়ে গেলে হঠাৎ করে জোরে বাজানো এড়ানো অন্তর্ভুক্ত।

ভলিউম কন্ট্রোল ব্যবহার করা

কোনও গেম বা মিউজিক অ্যাপে ব্যবহারকারী ভলিউম কী প্রেস করলে ভলিউম পরিবর্তন হওয়া উচিত, এমনকি গানের মাঝে প্লেয়ার পজ করা থাকলেও বা বর্তমান গেম লোকেশনে কোনও মিউজিক না থাকলেও।

মিউজিক, অ্যালার্ম, বিজ্ঞপ্তি, ইনকামিং কলের রিংগার, সিস্টেমের সাউন্ড, ইন-কল ভলিউম এবং DTMF টোন চালানোর জন্য Android আলাদা অডিও স্ট্রিম ব্যবহার করে। এটি ব্যবহারকারীদের প্রতিটি স্ট্রিমের ভলিউম আলাদাভাবে নিয়ন্ত্রণ করতে দেয়।

ডিফল্ট হিসেবে, ভলিউম কন্ট্রোল প্রেস করলে অ্যাক্টিভ অডিও স্ট্রিমের ভলিউম পরিবর্তিত হয়। আপনার অ্যাপে বর্তমানে কিছু না চললে, ভলিউম কী প্রেস করলে মিউজিকের ভলিউম (বা Android 9-এর আগের ভার্সনে রিংগারের ভলিউম) অ্যাডজাস্ট হয়।

আপনার অ্যাপ অ্যালার্ম ঘড়ি না হলে, আপনাকে ব্যবহার AudioAttributes.USAGE_MEDIA-এর সাথে অডিও চালাতে হবে।

ভলিউম কন্ট্রোল যাতে সঠিক স্ট্রিম অ্যাডজাস্ট করে তা নিশ্চিত করতে, আপনাকে setVolumeControlStream() কল করতে হবে এবং আপনার অ্যাট্রিবিউটের সাথে ম্যাচ করে এমন স্ট্রিমের ধরন পাস করতে হবে যা আপনি AudioAttributes.getVolumeControlStream থেকে ফিরিয়ে আনতে পারবেন।

Kotlin

setVolumeControlStream(AudioManager.STREAM_MUSIC)

জাভা

setVolumeControlStream(AudioManager.STREAM_MUSIC);

আপনার অ্যাপের লাইফসাইকেলে এই কল করুন, সাধারণত অ্যাক্টিভিটির onResume() মেথড বা ফ্র্যাগমেন্ট থেকে যা আপনার মিডিয়া কন্ট্রোল করে। এটি টার্গেট অ্যাক্টিভিটি বা ফ্র্যাগমেন্ট দেখা গেলেই ভলিউম কন্ট্রোলকে STREAM_MUSIC-এর সাথে কানেক্ট করে।

প্রোগ্রাম্যাটিক্যালি স্ট্রিম ভলিউম কন্ট্রোল করা

বিরল ক্ষেত্রে, আপনি প্রোগ্রাম্যাটিক্যালি অডিও স্ট্রিমের ভলিউম সেট করতে পারেন। যেমন, আপনার অ্যাপ আগে থেকে থাকা UI পরিবর্তন করলে। এটি সাজেস্ট করা হয় না কারণ Android AudioManager একই ধরনের সব অডিও স্ট্রিম একসাথে মিক্স করে। এইসব পদ্ধতি স্ট্রিম ব্যবহার করে এমন প্রতিটি অ্যাপের ভলিউম পরিবর্তন করে। এগুলি ব্যবহার করা এড়িয়ে চলুন:

ফিক্সড-ভলিউম ডিভাইসের সাথে কাজ করা

কিছু ডিভাইসে (যেমন Chromebooks এবং Android Automotive OS গাড়ি) ভলিউম কন্ট্রোল আছে কিন্তু অ্যাপকে অডিও স্ট্রিমের লেভেল পরিবর্তন করার জন্য আগে বর্ণিত AudioManager পদ্ধতি ব্যবহার করার অনুমতি দেয় না। এগুলিকে ফিক্সড-ভলিউম ডিভাইস বলা হয়। isVolumeFixed() কল করে আপনি জানতে পারবেন যে আপনার অ্যাপটি ফিক্সড-ভলিউম ডিভাইসে চলছে কিনা।

একটি অডিও অ্যাপের আউটপুট ভলিউম ব্যালেন্স করার ক্ষমতা থাকা উচিত অন্যান্য অ্যাপের সাথে যা একই স্ট্রিমে চলতে পারে। ফিক্সড-ভলিউম ডিভাইসে, অ্যাপের নিজস্ব ভলিউম কন্ট্রোল উপযুক্ত setVolume() পদ্ধতির সাথে কানেক্ট করতে হবে:

খেলোয়াড় পদ্ধতি
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
        }
    }
}

জাভা

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)
    }
}

জাভা

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);
  }
}