Pengguna berharap dapat mengontrol volume aplikasi audio. Perilaku standar mencakup kemampuan untuk menggunakan kontrol volume (baik tombol atau kenop pada perangkat atau penggeser di UI), dan agar tidak tiba-tiba memutar suara keras 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 DTMF yang sama. Hal ini memungkinkan pengguna untuk mengontrol volume setiap aliran secara terpisah.
Secara default, menekan kontrol volume akan mengubah volume audio yang aktif feed. Jika aplikasi Anda saat ini tidak memutar apa pun, tekan tombol volume menyesuaikan volume musik (atau volume pendering sebelum Android 9).
Kecuali jika aplikasi Anda adalah jam alarm, Anda harus memutar audio dengan penggunaan
AudioAttributes.USAGE_MEDIA
.
Untuk memastikan bahwa
kontrol volume dapat disesuaikan
aliran yang benar, Anda harus memanggil
setVolumeControlStream()
meneruskan jenis aliran data yang sesuai dengan atribut yang bisa 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 onResume()
aktivitas atau fragmen yang mengontrol media Anda. Ini 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. Sebagai
contoh, saat aplikasi Anda mengganti UI yang sudah ada. Hal ini tidak disarankan karena
AudioManager
Android mencampur semua streaming audio dari jenis yang sama.
Metode ini akan mengubah volume setiap aplikasi yang menggunakan aliran tersebut. Hindari penggunaan
mereka:
adjustStreamVolume()
adjustSuggestedStreamVolume()
adjustVolume()
setStreamVolume() setStreamVolume()
setStreamSolo()
setStreamMute()
Bekerja dengan perangkat volume tetap
Beberapa perangkat (seperti Chromebook) memiliki kontrol volume, tetapi tidak mengizinkan aplikasi menggunakan AudioManager
metode yang dijelaskan di atas untuk mengubah level streaming audio. Mereka 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 {i>outputnya<i} dengan aplikasi lain
yang mungkin diputar di {i>stream<i} yang sama.
Di 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 internal, colokan headphone untuk {i>headset <i}berkabel, dan banyak juga fitur konektivitas dan dukungan Bluetooth untuk Audio A2DP.
Saat headset dicabut atau perangkat Bluetooth terputus, streaming audio akan otomatis dialihkan ke speaker bawaan. Jika Anda mendengarkan musik dengan kecepatan tinggi bisa menghasilkan suara yang berisik.
Pengguna biasanya mengharapkan aplikasi yang menyertakan pemutar musik dengan pemutaran di layar untuk menjeda pemutaran. Aplikasi lain, seperti game yang tidak termasuk kontrol, seharusnya terus diputar. Pengguna dapat menyesuaikan volume dengan perangkat keras di perangkat mereka.
Saat output audio beralih kembali ke speaker bawaan, sistem akan menyiarkan ACTION_AUDIO_BECOMING_NOISY
intent. Anda harus membuat BroadcastReceiver
yang mendengarkan 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 aplikasi Anda didesain 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); } }