本指南介绍了 Wear OS 上的应用如何使用熟悉的 Android API 播放音频。
检测音频设备
Wear OS 应用必须首先检测可穿戴设备是否具有适当的音频输出。开发者可以预期可穿戴设备至少具有以下一种音频输出:
AudioDeviceInfo.TYPE_BUILTIN_SPEAKER
:在具有内置扬声器的设备上AudioDeviceInfo.TYPE_BLUETOOTH_A2DP
:当蓝牙耳机已配对并连接时AudioDeviceInfo.TYPE_BLE_BROADCAST
:当低功耗蓝牙 (BLE) 广播组设备已配对并连接时AudioDeviceInfo.TYPE_BLE_HEADSET
:当 BLE 耳机已配对并连接时AudioDeviceInfo.TYPE_BLE_SPEAKER
:当 BLE 扬声器已配对并连接时
在以下示例中,应用使用 getDevices()
方法结合 FEATURE_AUDIO_OUTPUT
的值来枚举所有音频输出。
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)
为了提供最佳用户体验,您的应用应确保仅在蓝牙耳机或扬声器连接到手表时播放媒体。
选择首选音频输出设备
根据您的应用用例以及音频对应用核心体验的重要性,选择您希望用户如何与应用的音频输出互动。
让用户选择媒体输出设备
从 Wear OS 5 开始,系统提供了一个 UI,允许用户选择播放媒体的设备,并显示有关当前播放媒体内容的信息。
如果您的应用检测到在 Wear OS 5 或更高版本设备上提供音频播放时没有连接蓝牙耳机,请建议用户直接转到媒体输出切换器。在不支持媒体输出切换器的设备上,调用 ACTION_BLUETOOTH_SETTINGS
intent 操作,它会将用户带到系统设置中的蓝牙页面。
GitHub 上 Horologist 库中的 launchOutputSelection()
方法演示了如何让用户选择他们的媒体输出设备。
蓝牙耳机
与设备上始终可用的内置扬声器不同,蓝牙耳机可以在应用运行时进行配对或取消配对。如果应用需要耳机才能继续,请注册回调以检测用户何时使用 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)
如果您的应用检测到在需要提供音频输出时没有连接蓝牙耳机,请不要显示错误消息。相反,请建议用户直接前往蓝牙设置,以便他们更轻松地连接。这可以通过发送带有 ACTION_BLUETOOTH_SETTINGS
的 Intent 来完成。
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)
扬声器
大多数 Wear OS 设备都带有扬声器。如果您的应用提供了包含声音的非媒体用例,请考虑使用扬声器来提供与用户的额外互动维度。例如,配备扬声器的 Wear OS 设备可能会触发闹钟或计时器,并带有音频通知,健身应用可能会使用扬声器提供锻炼指导。
注意:扬声器并非为此目的而设计,因此无法提供最佳的媒体内容聆听体验。
有关详细信息,请参阅 WearSpeakerSample。
播放音频
一旦您检测并选择了合适的音频输出,在 Wear OS 上播放音频的过程与在移动设备或其他设备上相同。有关详细信息,请参阅 MediaPlayer 概览。为了更轻松地访问高级功能(例如流媒体和下载媒体),请使用 ExoPlayer。请务必遵循音频应用的最佳实践,例如管理音频焦点。
防止通过扬声器进行意外媒体播放
媒体应用可以遵循以下指南,以确保应用不会在手表的内置扬声器上意外播放媒体内容。指南因应用使用的播放器而异。
ExoPlayer
如果您的应用正在使用 ExoPlayer
在构建 ExoPlayer 实例时调用 setSuppressPlaybackOnUnsuitableOutput(true)
ExoPlayer exoplayer = ExoPlayer.Builder(context) .setAudioAttributes(...) .setSuppressPlaybackWhenUnsuitableOutput(true) // ... .build()
-
通过将 WearUnsuitableOutputPlaybackSuppressionResolverListener 注册为 ExoPlayer 实例的监听器来响应播放抑制事件
exoPlayer.addListener(WearUnsuitableOutputPlaybackSuppressionResolverListener(context))
Horologist 媒体工具包
Horologist MediaToolkit 已包含防止在内置手表扬声器上意外播放媒体内容的逻辑。
其他媒体播放器
- 确保媒体音频播放不会开始,除非有合适的输出设备(例如耳机或一组外部扬声器)连接到手表。请参阅以下列表,了解适用于媒体应用的合适输出设备:
- 如果 AudioManager 通知您的应用外部音频输出设备已与手表断开连接,请暂停播放。
- 当用户尝试启动媒体播放但未连接外部音频设备时,提示用户将此类设备连接到手表。