অডিও আউটপুট পরিবর্তন হ্যান্ডলিং

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

ভলিউম নিয়ন্ত্রণ ব্যবহার করে

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

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

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

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

ভলিউম কন্ট্রোলগুলি সঠিক স্ট্রীমকে সামঞ্জস্য করে তা নিশ্চিত করার জন্য, আপনাকে setVolumeControlStream() কল করা উচিত আপনার বৈশিষ্ট্যগুলির সাথে মিলে যাওয়া স্ট্রীম টাইপের পাসিং যা আপনি AudioAttributes.getVolumeControlStream থেকে পুনরুদ্ধার করতে পারেন।

কোটলিন

setVolumeControlStream(AudioManager.STREAM_MUSIC)

জাভা

setVolumeControlStream(AudioManager.STREAM_MUSIC);

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

প্রোগ্রামিকভাবে স্ট্রিম ভলিউম নিয়ন্ত্রণ করা

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

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

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

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

প্লেয়ার পদ্ধতি
অডিও গান AudioTrack.setVolume()
মিডিয়া প্লেয়ার MediaPlayer.setVolume()
এক্সো প্লেয়ার SimpleExoPlayer.setVolume() ব্যবহার করুন যা অন্তর্নিহিত অডিওট্র্যাকের ভলিউম সেট করে।

গোলমাল করবেন না

ব্যবহারকারীদের কাছে তাদের অ্যান্ড্রয়েড ডিভাইস থেকে অডিও উপভোগ করার ক্ষেত্রে অনেকগুলি বিকল্প রয়েছে৷ বেশিরভাগ ডিভাইসে একটি অন্তর্নির্মিত স্পিকার, তারযুক্ত হেডসেটের জন্য হেডফোন জ্যাক রয়েছে এবং অনেকগুলি ব্লুটুথ সংযোগ এবং A2DP অডিওর জন্য সমর্থনও রয়েছে।

যখন একটি হেডসেট আনপ্লাগ করা হয় বা একটি ব্লুটুথ ডিভাইস সংযোগ বিচ্ছিন্ন হয়, তখন অডিও স্ট্রীম স্বয়ংক্রিয়ভাবে বিল্ট-ইন স্পিকারের দিকে চলে যায়। আপনি যদি উচ্চ ভলিউমে গান শোনেন তবে এটি একটি শোরগোল আশ্চর্য হতে পারে।

ব্যবহারকারীরা সাধারণত এই ক্ষেত্রে প্লেব্যাককে বিরতি দেওয়ার জন্য অনস্ক্রিন প্লেব্যাক নিয়ন্ত্রণ সহ একটি মিউজিক প্লেয়ার অন্তর্ভুক্ত করে এমন অ্যাপগুলি আশা করে৷ অন্যান্য অ্যাপ্লিকেশানগুলি, যেমন গেমগুলি যেগুলিতে নিয়ন্ত্রণ অন্তর্ভুক্ত নয়, সেগুলি খেলা চালিয়ে যাওয়া উচিত৷ ব্যবহারকারী ডিভাইসের হার্ডওয়্যার নিয়ন্ত্রণের সাথে ভলিউম সামঞ্জস্য করতে পারেন।

অডিও আউটপুট বিল্ট-ইন স্পীকারে ফিরে গেলে সিস্টেমটি একটি ACTION_AUDIO_BECOMING_NOISY উদ্দেশ্য সম্প্রচার করে। আপনার একটি BroadcastReceiver তৈরি করা উচিত যা আপনি যখনই অডিও চালাচ্ছেন তখন এই অভিপ্রায়ের জন্য শুনবে। আপনার রিসিভার এই মত দেখতে হবে:

কোটলিন

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() মিডিয়া সেশন কলব্যাকে উপস্থিত হওয়া উচিত।

কোটলিন

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