Phát âm thanh trên thiết bị đeo

Hướng dẫn này mô tả cách ứng dụng trên Wear OS sử dụng các API Android quen thuộc để phát âm thanh.

Phát hiện các thiết bị âm thanh

Trước tiên, ứng dụng Wear OS phải phát hiện xem thiết bị đeo có đầu ra âm thanh phù hợp hay không. Nhà phát triển có thể trông đợi thiết bị đeo sẽ có ít nhất một trong các đầu ra âm thanh sau đây:

Trong ví dụ sau, ứng dụng dùng phương thức getDevices() kết hợp với giá trị của FEATURE_AUDIO_OUTPUT để liệt kê tất cả đầu ra âm thanh.

AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

fun audioOutputAvailable(type: Int): Boolean {
    if (!packageManager.hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT)) {
        return false
    }
    return audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS).any { it.type == type }
}

// True if the device has a speaker
audioOutputAvailable(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER)

// True if a Bluetooth headset is paired and connected
audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP)

// True if a BLE broadcast group device is paired and connected
audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_BROADCAST)

// True if a BLE headset is paired and connected
audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_HEADSET)

// True if a BLE speaker is paired and connected
audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_SPEAKER)

Để mang lại trải nghiệm phù hợp nhất cho người dùng, ứng dụng của bạn phải đảm bảo chỉ phát nội dung nghe nhìn khi tai nghe hoặc loa Bluetooth được kết nối với đồng hồ.

Chọn thiết bị ưu tiên cho đầu ra âm thanh

Tuỳ thuộc vào trường hợp sử dụng của ứng dụng và tầm quan trọng của âm thanh đối với trải nghiệm cốt lõi của ứng dụng, hãy chọn cách bạn muốn người dùng tương tác với đầu ra âm thanh của ứng dụng.

Cho phép người dùng chọn thiết bị đầu ra đa phương tiện

Kể từ Wear OS 5, hệ thống sẽ cung cấp một giao diện người dùng cho phép người dùng chọn thiết bị sẽ phát nội dung nghe nhìn và hiển thị thông tin về nội dung nghe nhìn đang phát nội dung.

Nếu ứng dụng của bạn phát hiện thấy không có tai nghe Bluetooth nào được kết nối khi bạn muốn để phát âm thanh trên thiết bị chạy Wear OS 5 trở lên, hãy đề xuất người dùng đến trình chuyển đổi đầu ra nội dung đa phương tiện. Trên những thiết bị không hỗ trợ nút chuyển đầu ra nội dung đa phương tiện, gọi ý định ACTION_BLUETOOTH_SETTINGS đưa người dùng tới trang Bluetooth trong phần cài đặt hệ thống.

Phương thức launchOutputSelection(), một phần của thư viện Horologist trên GitHub, minh hoạ cách cho phép người dùng chọn thiết bị đầu ra đa phương tiện.

Tai nghe Bluetooth

Không giống như loa tích hợp (luôn dùng được nếu có trên thiết bị), tai nghe Bluetooth có thể được ghép nối hoặc huỷ ghép nối khi ứng dụng của bạn đang chạy. Nếu ứng dụng yêu cầu tai nghe để tiếp tục, hãy đăng ký một lệnh gọi lại để phát hiện thời điểm người dùng kết nối và ngắt kết nối tai nghe Bluetooth bằng registerAudioDeviceCallback:

audioManager.registerAudioDeviceCallback(object : AudioDeviceCallback() {
    override fun onAudioDevicesAdded(addedDevices: Array<out AudioDeviceInfo>?) {
        super.onAudioDevicesAdded(addedDevices)
        if (audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP)
          || audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_BROADCAST)
          || audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_HEADSET)
          || audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_SPEAKER)) {
            // A Bluetooth or BLE device is connected and available for playback.
        }
    }
    override fun onAudioDevicesRemoved(removedDevices: Array<out AudioDeviceInfo>?) {
        super.onAudioDevicesRemoved(removedDevices)
        if (!(audioOutputAvailable(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP))
          && !(audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_BROADCAST))
          && !(audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_HEADSET))
          && !(audioOutputAvailable(AudioDeviceInfo.TYPE_BLE_SPEAKER))) {
            // No Bluetooth or BLE devices are connected anymore.
        }
    }
}, null)
  

Nếu ứng dụng của bạn phát hiện thấy không có tai nghe Bluetooth nào được kết nối khi bạn muốn cung cấp đầu ra âm thanh, đừng cho thấy thông báo lỗi. Thay vào đó, hãy đề nghị đưa người dùng đến thẳng chế độ cài đặt Bluetooth để họ dễ kết nối hơn. Bạn có thể thực hiện việc này bằng cách gửi một ý định bằng ACTION_BLUETOOTH_SETTINGS:

  val intent = with (Intent(Settings.ACTION_BLUETOOTH_SETTINGS)) {
      addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
      putExtra("EXTRA_CONNECTION_ONLY", true)
      putExtra("EXTRA_CLOSE_ON_CONNECT", true)
      putExtra("android.bluetooth.devicepicker.extra.FILTER_TYPE", 1)
  }
  startActivity(intent)
  

Loa

Hầu hết thiết bị Wear OS đều có loa. Nếu ứng dụng của bạn cung cấp trường hợp sử dụng không phải nội dung nghe nhìn có kết hợp âm thanh, hãy cân nhắc sử dụng loa để cung cấp thêm nhiều phương diện tương tác cho người dùng. Ví dụ: thiết bị Wear OS trang bị sẵn loa có thể kích hoạt chuông báo hoặc đồng hồ hẹn giờ, kèm theo thông báo âm thanh, đồng thời ứng dụng thể dục có thể dùng loa để đưa ra hướng dẫn tập thể dục.

Lưu ý: Loa không mang lại trải nghiệm tốt nhất khi nghe nội dung nghe nhìn vì chúng không được thiết kế cho mục đích này.

Tham khảo WearSpeakerSample để biết thông tin chi tiết.

Phát âm thanh

Sau khi bạn phát hiện và chọn đầu ra âm thanh phù hợp, quy trình phát âm thanh trên Wear OS sẽ giống như quy trình phát âm thanh trên thiết bị di động hoặc thiết bị khác. Để biết thêm thông tin, hãy xem nội dung Tổng quan về MediaPlayer. Để dễ dàng truy cập các tính năng nâng cao hơn, chẳng hạn như phát trực tuyến và tải nội dung xuống, hãy sử dụng ExoPlayer. Đừng quên làm theo các phương pháp hay nhất dành cho ứng dụng Âm thanh, chẳng hạn như Quản lý quyền phát âm thanh

Ngăn việc phát nội dung nghe nhìn ngoài ý muốn qua loa

Ứng dụng đa phương tiện có thể làm theo hướng dẫn sau để đảm bảo ứng dụng không vô tình phát nội dung nghe nhìn trên loa đồng hồ tích hợp. Hướng dẫn này sẽ khác nhau tuỳ thuộc vào trình phát mà ứng dụng đang sử dụng.

ExoPlayer

Nếu ứng dụng của bạn đang sử dụng ExoPlayer:

  1. Gọi setSuppressPlaybackOnUnsuitableOutput(true) trong khi tạo thực thể ExoPlayer:

      ExoPlayer exoplayer = ExoPlayer.Builder(context)
              .setAudioAttributes(...)
              .setSuppressPlaybackWhenUnsuitableOutput(true)
              // ...
              .build()
          
  2. Phản ứng với sự kiện chặn chế độ phát bằng cách đăng ký WearUnsuitableOutputPlaybackSuppressionResolverListener làm trình nghe của thực thể ExoPlayer:

  3.   exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
        

Bộ công cụ Horologist Media

Horologist MediaToolkit đã chứa logic để ngăn việc phát nội dung nghe nhìn ngoài ý muốn trên loa đồng hồ tích hợp.

Các trình phát nội dung nghe nhìn khác

  • Đảm bảo rằng quá trình phát âm thanh của nội dung nghe nhìn không bắt đầu trừ phi một thiết bị đầu ra phù hợp (chẳng hạn như tai nghe hoặc một bộ loa ngoài) đã kết nối với đồng hồ. Hãy xem danh sách sau đây để biết các thiết bị đầu ra phù hợp cho ứng dụng đa phương tiện:
  • Tạm dừng phát nếu AudioManager thông báo cho ứng dụng của bạn rằng thiết bị đầu ra âm thanh bên ngoài bị ngắt kết nối với đồng hồ.
  • Khi người dùng cố gắng bắt đầu phát nội dung nghe nhìn nhưng chưa kết nối với thiết bị âm thanh bên ngoài, hãy nhắc người dùng kết nối một thiết bị như vậy với đồng hồ của họ.