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

Android 14 引入了 API 更新,并伴随用户体验更改了蓝牙 LE 音频 (LEA) 设备(包括助听器)的音频路由行为。这些更改会影响 VoIP 应用如何管理音频输出选择。本文档为开发者提供了必要的信息,以便他们能够使自己的 VoIP 应用适应这些更改,并确保无缝的用户体验。

Android 14 中的行为变化

  • LEA 设备路由:LEA 设备现在在 Pixel 手机和 AOSP 上默认启用。但是,要主动识别并选择 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 中,助听器现在可见为设备,使应用能够为用户提供 UI 元素以选择其首选音频输出。
  • 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()