Xử lý các thay đổi trong đầu ra âm thanh

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:

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()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);
  }
}