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:
AudioDeviceInfo.TYPE_BUILTIN_SPEAKER
: trên các thiết bị có loa tích hợpAudioDeviceInfo.TYPE_BLUETOOTH_A2DP
: khi tai nghe Bluetooth đã được ghép nối và kết nốiAudioDeviceInfo.TYPE_BLE_BROADCAST
: khi một thiết bị trong nhóm truyền phát Bluetooth năng lượng thấp (BLE) đã được ghép nối và kết nốiAudioDeviceInfo.TYPE_BLE_HEADSET
: khi tai nghe BLE đã được ghép nối và kết nốiAudioDeviceInfo.TYPE_BLE_SPEAKER
: khi loa BLE đã được ghép nối và kết nối
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:
Gọi setSuppressPlaybackOnUnsuitableOutput(true) trong khi tạo thực thể ExoPlayer:
ExoPlayer exoplayer = ExoPlayer.Builder(context) .setAudioAttributes(...) .setSuppressPlaybackWhenUnsuitableOutput(true) // ... .build()
-
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:
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ọ.