Pengguna berharap dapat mengontrol volume aplikasi audio. Perilaku standar mencakup kemampuan untuk menggunakan kontrol volume (tombol atau kenop di perangkat atau penggeser di UI), dan untuk menghindari pemutaran 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 aliran 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 aliran audio yang aktif. Jika saat ini aplikasi Anda tidak memutar media apa pun, menekan tombol volume akan menyesuaikan volume musik (atau volume pendering di Android sebelum versi 9).
Kecuali jika aplikasi Anda adalah jam alarm, Anda harus memutar audio menggunakan AudioAttributes.USAGE_MEDIA
.
Untuk memastikan bahwa kontrol volume menyesuaikan
aliran audio 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 menggantikan UI yang sudah ada. Hal ini tidak direkomendasikan karena
AudioManager
Android memadukan semua aliran audio dari jenis yang sama.
Metode ini akan mengubah volume setiap aplikasi yang menggunakan aliran tersebut. Hindari menggunakannya:
adjustStreamVolume()
adjustSuggestedStreamVolume()
adjustVolume()
setStreamVolume() setStreamVolume()
setStreamSolo()
setStreamMute()
Bekerja dengan perangkat volume tetap
Beberapa perangkat (seperti Chromebook dan mobil Android Automotive OS) memiliki kontrol
volume, tetapi tidak mengizinkan aplikasi menggunakan metode AudioManager
yang dijelaskan
sebelumnya untuk mengubah level aliran audio. Perangkat 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 aliran yang sama.
Di perangkat volume tetap, aplikasi harus menghubungkan kontrol volumenya sendiri ke
metode setVolume()
yang sesuai:
Pemain | Metode |
---|---|
AudioTrack | AudioTrack.setVolume() |
MediaPlayer | MediaPlayer.setVolume() |
ExoPlayer | Gunakan SimpleExoPlayer.setVolume() yang menyetel volume AudioTrack sumber. |
Web | Tetapkan properti volume dari HTMLMediaElement |
Jangan berisik
Pengguna memiliki sejumlah alternatif untuk menikmati audio dari perangkat Android mereka. Sebagian besar perangkat dilengkapi speaker internal, colokan headphone untuk headset berkabel, dan banyak perangkat lainnya juga dilengkapi konektivitas Bluetooth dan dukungan untuk audio A2DP.
Saat headset dicabut atau koneksi perangkat Bluetooth terputus, aliran audio akan otomatis dialihkan ke speaker internal. Jika Anda mendengarkan musik dengan volume tinggi, hal ini bisa menjadi kejutan yang bising.
Dalam kasus semacam ini, biasanya pengguna menginginkan aplikasi yang menyertakan pemutar musik dengan kontrol pemutaran di layar untuk 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 Anda 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
dalam 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); } }