Android 14 中适用于 VoIP 应用的音频路由 API 更新

Android 14 引入了 API 更新,同时对蓝牙 LE 音频 (LEA) 设备(包括助听器)的音频路由行为进行了用户体验变更。这些变更影响了 VoIP 应用管理音频输出选择的方式。本文档提供了一些重要信息,可帮助开发者根据这些变化调整其 VoIP 应用,并确保提供流畅的用户体验。

Android 14 中的行为变更

  • LEA 设备路由:Pixel 手机和 AOSP 现在默认启用 LEA 设备。不过,如需主动识别和选择 LEA 设备作为音频输出设备,应用必须使用 API 级别 31 中引入的新 API。
  • 助听器路由:以前,即使用户明确选择了手机听筒,音频也始终默认默认使用助听器。在 Android 14 中,助听器现在显示为可用的音频输出选项之一,需要用户明确选择。

变更原因

  • 在 Android 12 之前,没有用于明确使用助听器进行通话的 API,导致音频在连接时始终默认使用助听器。
  • 这使得用户在不断开连接助听器的情况下很难从助听器切换到手机听筒。
  • 同样的问题也适用于蓝牙 LE 音频耳机。

为了应对这些挑战,Android 14 引入了一些变更,旨在让 VoIP 应用能够更好地控制音频路由,并确保在蓝牙配件之间保持一致的行为。

Android 14 中的关键变更

  • 用于路由选择的通用 API:Android 12 引入了 AudioManager.setCommunicationDevice,以允许应用指定音频路由,包括助听器和 LEA 设备。不过,在 Android 12 和 13 中,助听器不会显示为设备,这限制了此 API 的实用性。
  • 助听器可见性:在 Android 14 中,助听器现在显示为设备,让应用能够提供界面元素,供用户选择首选的音频输出。
  • API 废弃:Android 14 废弃了与音频路由相关的多个 API。开发者必须迁移到 API 级别 31 中引入的新 API,才能有效管理音频输出选择。

要求的开发者操作

  • 强烈建议:迁移到 Telecom Jetpack 库。如果可能,请将 VoIP 应用迁移到 Telecom Jetpack 库,以简化音频路由管理。
  • 如果无法迁移,请使用 setCommunicationDevice() 或最新的 API(见下文)。

已废弃的 API 及其替代项

在 Android 14 中已废弃 新增 API
AudioManager.isBluetoothScoOn() AudioManager.getCommunicationDevice()
AudioManager.isSpeakerphoneOn()
AudioManager.setSpeakerphoneOn() AudioManager.setCommunicationDevice()
AudioManager.startBluetoothSco()
AudioManager.stopBluetoothSco() AudioManager.clearCommunicationDevice()
Connection.getCallAudioState() Jetpack
CallControlScope.getAvailableEndpoints()
CallControlScope.getCurrentCallEndpoint()
CallControlScope#isMuted()

平台
CallEventCallback.onAvailableCallEndpointsChanged()
CallEventCallback.onCallEndpointChanged()
CallEventCallback.onMuteStateChanged()
Connection.onCallAudioStateChanged()
Connection.requestBluetoothAudio() Jetpack
CallControlScope#requestEndpointChange()

平台
CallControl#requestCallEndpointChange()
Connection.setAudioRoute()