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

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

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

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

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

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

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

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

کاتلین

setVolumeControlStream(AudioManager.STREAM_MUSIC)

جاوا

setVolumeControlStream(AudioManager.STREAM_MUSIC);

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

کنترل حجم جریان به صورت برنامه ای

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

کار با دستگاه های با حجم ثابت

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

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

بازیکن روش
آهنگ صوتی AudioTrack.setVolume()
MediaPlayer MediaPlayer.setVolume()
ExoPlayer از SimpleExoPlayer.setVolume() استفاده کنید که حجم AudioTrack زیرین را تنظیم می کند.

پر سر و صدا نباش

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