Người dùng muốn có thể kiểm soát âm lượng của một ứng dụng âm thanh. Hành vi chuẩn bao gồm khả năng sử dụng các nút điều khiển âm lượng (các nút hoặc núm trong giao diện người dùng) và để tránh việc đột nhiên phát to nếu thiết bị ngoại vi như tai nghe bị ngắt kết nối trong khi sử dụng.
Sử dụng các nút điều chỉnh âm lượng
Khi người dùng nhấn một phím âm lượng trong một trò chơi hoặc ứng dụng âm nhạc, thay đổi, ngay cả khi trình phát bị tạm dừng giữa các bài hát hoặc không có nhạc vị trí hiện tại của trò chơi.
Android sử dụng các luồng âm thanh riêng biệt để phát nhạc, chuông báo thông báo, chuông cuộc gọi đến, âm thanh hệ thống, âm lượng trong cuộc gọi và DTMF âm. Điều này cho phép người dùng kiểm soát âm lượng của từng luồng một cách độc lập.
Theo mặc định, việc nhấn nút điều khiển âm lượng sẽ sửa đổi âm lượng của âm thanh đang hoạt động luồng. Nếu ứng dụng của bạn hiện không phát nội dung nào, hãy nhấn vào phím âm lượng điều chỉnh âm lượng nhạc (hoặc âm lượng của trình tạo nhạc chuông trước Android 9).
Nếu ứng dụng của bạn không phải là đồng hồ báo thức, thì bạn nên phát âm thanh theo thông tin sử dụng
AudioAttributes.USAGE_MEDIA
.
Để đảm bảo rằng các chế độ điều chỉnh âm lượng sẽ điều chỉnh
đúng luồng, bạn nên gọi
setVolumeControlStream()
chuyển vào loại luồng khớp với thuộc tính mà bạn có thể truy xuất từ đó
AudioAttributes.getVolumeControlStream
Kotlin
setVolumeControlStream(AudioManager.STREAM_MUSIC)
Java
setVolumeControlStream(AudioManager.STREAM_MUSIC);
Thực hiện lệnh gọi này trong vòng đời của ứng dụng, thường là từ onResume()
của hoạt động hoặc mảnh điều khiển nội dung nghe nhìn của bạn. Điều này sẽ kết nối
điều chỉnh âm lượng thành STREAM_MUSIC
bất cứ khi nào mảnh hoặc hoạt động mục tiêu
có thể nhìn thấy.
Kiểm soát âm lượng của sự kiện phát trực tiếp theo phương thức lập trình
Trong một số ít trường hợp, bạn có thể đặt âm lượng của luồng âm thanh theo phương thức lập trình. Cho
ví dụ: khi ứng dụng của bạn thay thế giao diện người dùng hiện có. Bạn không nên làm vậy vì
AudioManager
của Android kết hợp tất cả luồng âm thanh cùng loại với nhau.
Các phương thức này thay đổi âm lượng của mọi ứng dụng dùng luồng. Tránh sử dụng
chúng:
adjustStreamVolume()
adjustSuggestedStreamVolume()
adjustVolume()
setStreamVolume() setStreamVolume()
setStreamSolo()
setStreamMute()
Làm việc với các thiết bị có âm lượng cố định
Một số thiết bị (chẳng hạn như Chromebook) có các nút điều khiển âm lượng nhưng không cho phép các ứng dụng dùng AudioManager
các phương thức được mô tả ở trên để thay đổi mức độ của luồng âm thanh. Đây được gọi là
âm lượng cố định. Bạn có thể khám phá xem
ứng dụng đang chạy trên một thiết bị có âm lượng cố định bằng cách gọi isVolumeFixed()
.
Ứng dụng âm thanh phải giúp bạn cân bằng
âm lượng đầu ra của nó với các ứng dụng khác có thể đang phát trên cùng một luồng.
Trên các thiết bị có âm lượng cố định, ứng dụng sẽ kết nối các nút điều khiển âm lượng riêng với
phương thức setVolume()
phù hợp trong bảng dưới đây:
Người chơi | Phương thức |
---|---|
Bản âm thanh | AudioTrack.setVolume() |
MediaPlayer | MediaPlayer.setVolume() |
ExoPlayer | Dùng SimpleExoPlayer.setVolume() để đặt âm lượng của AudioTrack cơ bản. |
Đừng ồn ào
Người dùng có nhiều lựa chọn thay thế để thưởng thức âm thanh của thiết bị Android của họ. Hầu hết thiết bị đều có loa tích hợp, giắc cắm tai nghe cho tai nghe có dây, cũng như nhiều tai nghe có kết nối Bluetooth và hỗ trợ Âm thanh A2DP.
Khi tai nghe không cắm điện hoặc thiết bị Bluetooth đã bị ngắt kết nối, luồng âm thanh tự động định tuyến lại tới loa tích hợp. Nếu bạn nghe nhạc ở cường độ cao âm lượng, đây có thể là một sự ngạc nhiên gây ồn ào.
Người dùng thường mong đợi các ứng dụng có trình phát nhạc có khả năng phát trên màn hình để tạm dừng phát trong trường hợp này. Các ứng dụng khác, chẳng hạn như những trò chơi không bao gồm các nút điều khiển, nên tiếp tục phát. Người dùng có thể điều chỉnh âm lượng bằng các chế độ điều khiển phần cứng của thiết bị.
Khi đầu ra âm thanh chuyển về loa tích hợp, hệ thống sẽ truyền tin một ACTION_AUDIO_BECOMING_NOISY
ý định. Bạn nên tạo một BroadcastReceiver
lắng nghe ý định này bất cứ khi nào bạn phát âm thanh. Trình nhận của bạn sẽ có dạng như sau:
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 } } }
Đăng ký receiver khi bạn bắt đầu phát và huỷ đăng ký khi dừng phát.
Nếu bạn thiết kế ứng dụng như chúng tôi mô tả trong hướng dẫn này, thì những lệnh gọi này sẽ xuất hiện
trong các lệnh gọi lại phiên đa phương tiện onPlay()
và 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); } }