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

Android 14 推出了 API 更新,同时伴随着蓝牙低功耗音频 (LEA) 设备(包括助听器)音频路由行为的用户体验变化。这些变化影响了 VoIP 应用管理音频输出选择的方式。本文档为开发者提供了必要信息,帮助他们使 VoIP 应用适应这些变化并确保流畅的用户体验。

Android 14 中的行为变更

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

变更的理由

  • 在 Android 12 之前,没有 API 可以明确地将助听器用于通话,导致连接助听器时音频总是默认路由到助听器。
  • 这使得用户难以在不断开助听器的情况下从助听器切换到听筒。
  • 同样的问题也适用于蓝牙低功耗音频头戴式设备。

为了解决这些挑战,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()