مدیریت تغییرات در خروجی صوتی

کاربران انتظار دارند بتوانند میزان صدای برنامه صوتی را کنترل کنند. رفتار استاندارد شامل توانایی استفاده از کنترل‌های میزان صدا (دکمه‌ها یا پیچ‌های روی دستگاه یا لغزنده‌ها در میانای کاربر) و جلوگیری از پخش ناگهانی با صدای بلند درصورت قطع شدن اتصال دستگاه‌های جانبی مانند هدفون درحین استفاده است.

استفاده از کنترل‌های میزان صدا

وقتی کاربر کلید میزان صدا را در بازی یا برنامه موسیقی فشار می‌دهد، میزان صدا باید تغییر کند، حتی اگر پخش‌کننده بین آهنگ‌ها موقتاً متوقف شده باشد یا موسیقی‌ای برای مکان فعلی بازی وجود نداشته باشد.

Android از جاری‌سازی‌های صوتی جداگانه‌ای برای پخش موسیقی، زنگ‌های هشدار، اعلان‌ها، زنگ تماس ورودی، صداهای سیستم، میزان صدای حین تماس، و آهنگ‌های DTMF استفاده می‌کند. این ویژگی به کاربران امکان می‌دهد میزان صدای هر جاری‌سازی را به‌طور مستقل کنترل کنند.

به‌طور پیش‌فرض، فشار دادن کنترل میزان صدا، میزان صدای جاری‌سازی صوتی فعال را تغییر می‌دهد. اگر برنامه‌تان درحال‌حاضر چیزی پخش نمی‌کند، فشردن کلیدهای میزان صدا میزان صدای موسیقی (یا میزان صدای زنگ قبل‌از Android 9) را تنظیم می‌کند.

مگر اینکه برنامه‌تان ساعت زنگ‌دار باشد، باید صدا را بااستفاده از AudioAttributes.USAGE_MEDIA پخش کنید.

برای اطمینان از اینکه کنترل‌های میزان صدا جاری‌سازی صحیح را تنظیم می‌کند، باید setVolumeControlStream() را فراخوانی کنید و نوع جاری‌سازی مطابق با مشخصه‌هایتان را که می‌توانید از AudioAttributes.getVolumeControlStream بازیابی کنید ارسال کنید.

کاتلین

setVolumeControlStream(AudioManager.STREAM_MUSIC)

جاوا

setVolumeControlStream(AudioManager.STREAM_MUSIC);

این فراخوانی را در چرخه حیات برنامه‌تان انجام دهید، معمولاً از روش onResume() فعالیت یا قطعه‌ای که رسانه‌تان را کنترل می‌کند. این کار کنترل‌های میزان صدا را به STREAM_MUSIC متصل می‌کند، هر زمان که فعالیت یا قطعه هدف قابل‌مشاهده باشد.

کنترل کردن میزان صدای جاری‌سازی به‌صورت برنامه‌نویسی‌شده

در موارد نادر، می‌توانید میزان صدای جاری‌سازی صوتی را به‌صورت برنامه‌نویسی‌شده تنظیم کنید. برای مثال، وقتی برنامه‌تان جایگزین یک میانای کاربر موجود می‌شود. این کار توصیه نمی‌شود زیرا Android AudioManager همه جاری‌سازی‌های صوتی از یک نوع را باهم ترکیب می‌کند. این روش‌ها میزان صدای هر برنامه‌ای را که از جاری‌سازی استفاده می‌کند تغییر می‌دهد. از استفاده از آن‌ها اجتناب کنید:

کار کردن با دستگاه‌های دارای صدای ثابت

برخی‌از دستگاه‌ها (مانند Chromebook و خودروهای دارای «سیستم‌عامل Android Automotive») کنترل‌های میزان صدا دارند اما به برنامه‌ها اجازه نمی‌دهند از روش‌های AudioManager که قبلاً توضیح داده شد برای تغییر سطح جاری‌سازی صوتی استفاده کنند. به این دستگاه‌ها، دستگاه‌های با میزان صدای ثابت می‌گویند. با فراخوانی isVolumeFixed() می‌توانید متوجه شوید که آیا برنامه‌تان در دستگاهی با میزان صدای ثابت اجرا می‌شود یا نه.

برنامه صوتی باید بتواند میزان صدای خروجی‌اش را با برنامه‌های دیگری که ممکن است در همان جاری‌سازی درحال پخش باشند تراز کند. در دستگاه‌های دارای میزان صدای ثابت، برنامه باید کنترل‌های میزان صدای خود را به روش setVolume() مناسب متصل کند:

پخش‌کننده روش
AudioTrack AudioTrack.setVolume()
MediaPlayer MediaPlayer.setVolume()
ExoPlayer از SimpleExoPlayer.setVolume() استفاده کنید که میزان صدای AudioTrack زیرین را تنظیم می‌کند.
وب تنظیم کردن ویژگی volume مربوط به HTMLMediaElement

سروصدا نکنید

کاربران گزینه‌های متعددی برای لذت بردن از صدای دستگاه‌های Android خود دارند. اکثر دستگاه‌ها بلندگوی داخلی، فیش هدفون برای هدست‌های سیمی دارند و بسیاری از آن‌ها از اتصال بلوتوث و صدای 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);
  }
}