低功耗蓝牙音频 (LEA) 可确保用户接收到高保真度的音频,而不必牺牲电池续航时间,并且还可以在不同使用情形之间无缝切换。Android 13(API 级别 33)内置了对 LEA 的支持。
在 LEA 源设备市场份额增长之前,大多数 LEA 头戴式耳机都将采用双模式。用户应该能够在双模式耳机上配对和设置两种传输方式。
使用场景
您可能需要在以下使用场景中集成 LEA:
共享音频:用户可以同时将多个音频流共享给一个或多个音频接收器设备。音频会在源设备和已连接的设备之间同步。
广播音频:用户可以向亲朋好友广播音频,同时还可以连接到公共广播,获取信息、娱乐内容或无障碍服务。
LC3 音频编解码器支持:这是默认音频编解码器,取代了用于 A2DP(媒体)的 SBC 编解码器和用于 HFP(语音)的 mSBC 编解码器。LC3 更高效、可重新配置且质量更高。
改进了音频节录:使用麦克风时,头戴式耳机可以保持高输出音质。使用蓝牙麦克风时,传统蓝牙会降低音质。借助 BLE 音频,输入和输出采样率可达到 32 kHz。
立体声麦克风:可穿戴设备可以使用立体声麦克风录制音频,以增强空间音频效果。
支持 Hearing Aid Profile (HAP):与之前的 ASHA 协议相比,HAP 可为用户提供更高的可访问性和使用便利性。用户可以使用助听器进行通话和使用 VoIP 应用。
增强型属性协议 (EATT) 支持:借助 EATT,开发者可以一次向配对的听戴设备发送多条命令。
关键场景
用例主要分为以下四类:
对话:需要低延迟通信路由的拨号器和 VoIP 应用可提供高品质音频并减少电池用量。
游戏:同时使用麦克风和高保真播放功能,让游戏能够将高品质音频流式传输到可穿戴设备。当游戏将蓝牙麦克风设为准备就绪状态时,游戏应用可以访问 BLE 音频输入。然后,当玩家开始与另一位玩家进行实时对话时,游戏应用可以立即使用麦克风数据。
媒体:媒体应用可以设置音频管理器的首选设备。用户可以在系统设置中更改首选设备,从而替换此设置。
无障碍功能:支持 BLE 音频的助听器现在可以使用麦克风,让用户能够持续使用助听器进行通话。
BLE 音频 API 和方法
如需支持 BLE 音频可穿戴设备,必须具备以下 API 和方法:
AudioManager
setCommunicationDevice()选择应在通信使用情形(例如语音或视频通话)中使用的音频设备。语音或视频聊天应用可以使用此方法来选择不同于平台默认选择的音频设备。此 API 取代了以下已弃用的 API:startBluetoothSco()、stopBluetoothSco()和setSpeakerphoneOn()。clearCommunicationDevice()在应用完成通话或会话后调用,以确保用户在不同应用之间切换时获得出色的体验。
BluetoothProfile
BluetoothLeAudio通过代理对象控制蓝牙服务。
电信 InCallService
InCallService#requestCallEndpointChange()取代了已弃用的InCallService.setAudioRoute()和InCallService.requestBluetoothAudio()API,以允许应用请求将音频路由到特定的CallEndpoint。客户端在请求更改时,不应定义自己的CallEndpoint。新端点应为InCallService.onAvailableCallEndpointsChanged(java.util.List)提供的有效端点之一。CallEndpoint.TYPE_BLUETOOTH通过蓝牙定向音频串流。- 上述
InCallServiceAPI 旨在供 Android 手机上的默认电话应用或其他通话平台(例如穿戴式设备、汽车或其他可能想要影响音频路由的蓝牙设备)使用。
电信 CallControl
- 新的
CallControl类在 API 级别 34 中引入,仅用于 VoIP 应用,以取代Connection和ConnectionService。 CallControl.requestCallEndpointChange()还请求进行CallEndpoint更改。此 API 取代了已弃用的Connection.requestBluetoothAudio()和Connection.setAudioRoute()API。- 除了更新后的 Telecom 平台 API 之外,在构建语音和/或视频通话应用时,强烈建议使用 Telecom Jetpack 库。此库可以大大简化集成流程,并改善所有 Android 设备上的 VoIP 通话体验。
音频设备信息
AudioDeviceInfo.TYPE_BLE_HEADSET将音频设备类型描述为 LEA 设备。用于确定可穿戴听力辅助设备是否为 LEA 设备。
录音器
setPreferredDevice()用于设置音频路由要使用的首选设备。用户可以在系统设置中覆盖此设置。
蓝牙适配器
isLeAudioSupported():返回一个@BluetoothStatusCodes常量(FEATURE_SUPPORTED、FEATURE_NOT_SUPPORTED或错误代码),用于指示设备硬件是否支持 LE 音频。isLeAudioBroadcastSourceSupported(): 返回一个@BluetoothStatusCodes常量(FEATURE_SUPPORTED、FEATURE_NOT_SUPPORTED或错误代码),用于指示设备硬件是否支持 LE 音频广播源。
基于应用场景的指南
以下是根据具体使用场景实现 LEA 的准则。
语音通信应用
语音通信应用可以选择自行管理音频路由和设备状态,也可以使用 Telecom API,该 API 会为您处理音频路由和状态逻辑。
自行管理:对于目前使用
startBluetoothSco()、stopBluetoothSco()和setSpeakerphoneOn()或想要自行管理音频路由状态的应用,请按照音频管理器自行管理的通话指南操作。受管理:使用 Telecom Jetpack 库或 Telecom 平台 API 创建音频或视频通话应用。
这两种解决方案可让您快速轻松地控制音频转接并在蓝牙设备之间切换。如需了解详情,请参阅电信管理型通话指南。
录音应用
- 媒体录制器:使用媒体录制器录制音频时,如果蓝牙可听设备支持 LEA,您现在可以录制立体声音频。请参阅录音指南。
LE 音频 (LEA) 耳机建议
随着更多 LEA 头戴式耳机发布,我们在实际测试中发现了一些会降低用户体验的问题。该规范并未涵盖所有这些问题。下表列出了 LEA 头戴式耳机制造商应遵循的建议,以改善 Android 用户的端到端体验。
| 说明 | 上下文 |
|---|---|
支持双模式耳机的跨传输密钥派生 (CTKD):
|
在 LEA 源设备市场份额增长之前,大多数新的 LEA 耳机都将采用双模式。用户能够顺畅地配对双模耳机并设置两种传输方式非常重要。这对 Google 快速配对功能也很重要。 |
|
如果您希望 LEA 头戴式耳机能够可靠地重新连接到来源设备,请支持定向公告 (TA)。 LE 音频入耳式耳机应使用 TA 来请求来自中央设备的传入连接。 将添加到即将到来的 BT SIG。 |
与 BR/EDR 的寻呼模型(手机或耳机均可发起连接)不同,LEA 中的连接必须由中心设备发起。目前,许多头戴式耳机不使用 TA,这意味着中央设备可能无法在不将其添加到许可名单的情况下重新连接到外围设备。 不过,许可名单解决方法可能会阻止耳机连接到其他中央设备。因此,LEA 头戴式耳机必须正确支持 TA,以便中央设备能够可靠地重新连接,而无需使用可能会中断多点连接的解决方法。 |
优化了双模式耳机在“查找我的设备”中的曝光率
|
这样可以防止双模式 LEA 耳机在蓝牙设置中显示为重复条目,这可能会让用户感到困惑,并影响 LEA 配对体验。
动态主设备选举对于以增量方式配对的双模式设备尤为重要。例如,如果初始配对时只有一个耳机,则应将自身显示为双模式设备。当用户稍后与第二个耳机配对时,只需与 LE 组件配对,CSIP 会确保它们在 Android 上分组在一起。 建议在配对期间使用身份地址,因为 BR/EDR 组件已将设备的公共地址公开给附近的设备。 |
| 支持增强型属性协议 (EATT)。 | 缩短配对和连接延迟时间。 |
| 支持强大的 GATT 缓存。 | 缩短连接延迟时间,尤其是对于 TWS 耳机。 |
| 支持连接子评级。 | 支持更灵活的数据包调度,并可能节省电池电量。 |
| 确保在播放和捕获的预处理和后处理期间,信号处理流水线可以以 16、24、32 和 48 kHz 的频率运行,并支持更高的频率。 | 利用 LEA 调用或 VoIP 捕获路径和媒体播放支持的更高采样率。 |
| 支持 LE 电源控制 | 更出色的电源管理 |
上下文类型支持
| 说明 | 上下文 |
|---|---|
| 使用分配的号码 6.12.3 中指定的所有情境类型,除非耳机明确不支持给定的情境类型。 | 例如,如果不支持“游戏”上下文类型,Android 将发送游戏声音。请特别注意,“未指定”上下文类型并不意味着“任何上下文类型”,也不涵盖不受支持的上下文类型。 |
当中央设备与外围设备的 ASCS 交互时,外围设备必须连接到中央设备的 MCS 和 TBS。 中心设备可能不会始终使用 LE 音频作为流式传输路由,因为它可能会回退到使用 A2DP 或 HFP。外围设备可以使用 ASCS 交互来指示中心设备是否将使用 LE 音频进行流式传输。 ASCS 互动的一些示例包括读取、写入和注册通知。 |