关键词:可穿戴设备、媒体、collection_guideslandingwear
本指南介绍 Wear OS 上的应用如何使用熟悉的 Android API 播放音频。
检测音频设备
Wear OS 应用必须首先检测可穿戴设备是否具有合适的音频输出。开发者可以预期可穿戴设备至少具有以下一种可用的音频输出:
AudioDeviceInfo.TYPE_BUILTIN_SPEAKER
:在具有内置扬声器的设备上AudioDeviceInfo.TYPE_BLUETOOTH_A2DP
:当蓝牙耳机已配对并连接时AudioDeviceInfo.TYPE_BLE_BROADCAST
:当蓝牙低功耗 (BLE) 广播组设备已配对并连接时AudioDeviceInfo.TYPE_BLE_HEADSET
:当蓝牙耳机配对并连接时AudioDeviceInfo.TYPE_BLE_SPEAKER
:当蓝牙扬声器配对并连接时
在以下示例中,应用使用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
意图操作,这会将用户带到系统设置中的蓝牙页面。
launchOutputSelection()
方法(GitHub 上 Horologist 库的一部分)演示了如何让用户选择其媒体输出设备。
蓝牙耳机
与始终可用的内置扬声器不同,蓝牙耳机可以在应用运行时进行配对或取消配对。如果应用需要耳机才能继续运行,请注册一个回调以检测用户何时使用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
的意图来完成。
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
通知您的应用外部音频输出设备已从手表断开连接
,则暂停播放。 - 当用户尝试启动媒体播放但尚未连接外部音频设备时,
提示用户
将其设备连接到手表。