Menangani perubahan di output audio

Pengguna berharap dapat mengontrol volume aplikasi audio. Perilaku standar mencakup kemampuan untuk menggunakan kontrol volume (baik tombol atau kenop di perangkat maupun penggeser di UI), dan menghindari suara keras yang diputar secara tiba-tiba jika periferal seperti headphone terputus saat digunakan.

Menggunakan kontrol volume

Saat pengguna menekan tombol volume dalam aplikasi game atau musik, volume akan berubah, meskipun pemutar dijeda di antara lagu atau tidak ada musik untuk lokasi game saat ini.

Android menggunakan streaming audio terpisah untuk memutar musik, alarm, notifikasi, pendering panggilan masuk, suara sistem, volume dalam panggilan, dan nada DTMF. Hal ini memungkinkan pengguna untuk mengontrol volume setiap aliran secara terpisah.

Secara default, menekan kontrol volume akan mengubah volume streaming audio yang aktif. Jika aplikasi Anda saat ini tidak memutar apa pun, menekan tombol volume akan menyesuaikan volume musik (atau volume pendering sebelum Android 9).

Kecuali aplikasi Anda adalah jam alarm, Anda harus memutar audio dengan menggunakan AudioAttributes.USAGE_MEDIA.

Untuk memastikan kontrol volume menyesuaikan aliran yang tepat, Anda harus memanggil setVolumeControlStream() yang meneruskan jenis aliran yang cocok dengan atribut yang dapat Anda ambil dari AudioAttributes.getVolumeControlStream.

Kotlin

setVolumeControlStream(AudioManager.STREAM_MUSIC)

Java

setVolumeControlStream(AudioManager.STREAM_MUSIC);

Lakukan panggilan ini dalam siklus proses aplikasi Anda, biasanya dari metode onResume() aktivitas atau fragmen yang mengontrol media Anda. Tindakan ini akan menghubungkan kontrol volume ke STREAM_MUSIC setiap kali aktivitas atau fragmen target terlihat.

Mengontrol volume aliran secara terprogram

Dalam kasus yang jarang terjadi, Anda dapat menyetel volume aliran audio secara terprogram. Misalnya, saat aplikasi Anda mengganti UI yang sudah ada. Hal ini tidak direkomendasikan karena AudioManager Android menggabungkan semua streaming audio dari jenis yang sama. Metode ini akan mengubah volume setiap aplikasi yang menggunakan aliran tersebut. Hindari menggunakannya:

Bekerja dengan perangkat volume tetap

Beberapa perangkat (seperti Chromebook) memiliki kontrol volume, tetapi tidak mengizinkan aplikasi menggunakan metode AudioManager yang dijelaskan di atas untuk mengubah level aliran audio. Ini disebut perangkat volume tetap. Anda dapat mengetahui apakah aplikasi berjalan di perangkat volume tetap dengan memanggil isVolumeFixed().

Aplikasi audio harus menyediakan kemampuan untuk menyeimbangkan volume output-nya dengan aplikasi lain yang mungkin diputar di streaming yang sama. Pada perangkat volume tetap, aplikasi harus menghubungkan kontrol volumenya sendiri ke metode setVolume() yang sesuai pada tabel di bawah:

Pemain Metode
AudioTrack AudioTrack.setVolume()
MediaPlayer MediaPlayer.setVolume()
ExoPlayer Gunakan SimpleExoPlayer.setVolume() yang menyetel volume AudioTrack sumber.

Jangan berisik

Pengguna memiliki sejumlah alternatif untuk menikmati audio dari perangkat Android mereka. Sebagian besar perangkat memiliki speaker bawaan, colokan headphone untuk headset berkabel, dan banyak perangkat juga dilengkapi konektivitas Bluetooth dan dukungan untuk audio A2DP.

Saat headset dicabut atau koneksi perangkat Bluetooth terputus, streaming audio akan otomatis dialihkan ke speaker bawaan. Jika Anda mendengarkan musik dengan volume tinggi, ini bisa menjadi kejutan yang bising.

Dalam hal ini, pengguna biasanya berharap aplikasi yang menyertakan pemutar musik dengan kontrol pemutaran di layar akan menjeda pemutaran. Aplikasi lain, seperti game yang tidak menyertakan kontrol, akan terus diputar. Pengguna dapat menyesuaikan volume dengan kontrol hardware perangkat.

Saat output audio beralih kembali ke speaker bawaan, sistem akan menyiarkan intent ACTION_AUDIO_BECOMING_NOISY. Anda harus membuat BroadcastReceiver yang memproses intent ini setiap kali memutar audio. Penerima Anda akan terlihat seperti ini:

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

Daftarkan penerima ini saat Anda memulai pemutaran, dan batalkan pendaftaran saat Anda menghentikannya. Jika Anda mendesain aplikasi seperti yang kami jelaskan dalam panduan ini, panggilan ini akan muncul di callback sesi media onPlay() dan 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);
  }
}