Android NDK开发详解连接性之音频管理器自行管理的通话指南
本指南将介绍希望自行管理音频和可听设备状态的通信应用,例如互联网语音协议 (VoIP)。
注意 :从 Android 13(API 级别 33)开始,应用必须从 AudioManager#startBluetoothSco() 迁移到 AudioManager#setCommunicationDevice(),才能支持即将推出的 BLE 音频耳机。此变更向后兼容免触摸配置文件 (HFP) 设备。
注册音频回调
首先,创建一个 AudioDeviceCallback,用于在音频设备与设备连接或断开连接时通知您的应用。
Kotlin
val audioDeviceCallback: AudioDeviceCallback = object : AudioDeviceCallback() {
override fun onAudioDevicesAdded(addedDevices: Array) {}
override fun onAudioDevicesRemoved(removedDevices: Array) {}
}
audioManager.registerAudioDeviceCallback(audioDeviceCallback)
Java
final AudioDeviceCallback audioDeviceCallback = new AudioDeviceCallback() {
@Override
public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
}
@Override
public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {
// Handle device removal
}
};
audioManager.registerAudioDeviceCallback(audioDeviceCallback);
检查是否存在有效的通信设备
通过音频管理器,您可以了解当前处于活动状态的通信设备。
Kotlin
val currentCommunicationDevice: AudioDeviceInfo? = audioManager.communicationDevice
Java
AudioDeviceInfo currentCommunicationDevice = audioManager.getCommunicationDevice();
通过监听通信设备何时发生变化,您的应用便可知道何时应用了路由,以及您选择的设备何时处于活动状态。
Kotlin
val listener =
OnCommunicationDeviceChangedListener { device -> // Handle changes
currentCommunicationDevice = device
}
audioManager.addOnCommunicationDeviceChangedListener(executor, listener)
Java
AudioManager.OnCommunicationDeviceChangedListener listener =
new AudioManager.OnCommunicationDeviceChangedListener() {
@Override
void onCommunicationDeviceChanged(AudioDeviceInfo device) {
// Handle changes
currentCommunicationDevice = device;
}
};
AudioManager.addOnCommunicationDeviceChangedListener(executor, listener);
查找 BLE 音频设备
使用 getAvailableCommuncationDevices() 查看哪些设备可用于 VoIP 通话。使用 AudioDeviceInfo 查看设备是否为 BLE 耳机。本示例查找的是首款支持 BLE 音频的设备,但您也可以考虑查找所有受支持的设备,并允许用户进行选择。
Kotlin
// Get list of currently available devices
val devices = audioManager.availableCommunicationDevices
// User choose one of the devices, let's say, TYPE_BLE_HEADSET
val userSelectedDeviceType = AudioDeviceInfo.TYPE_BLE_HEADSET
//for the device from the list
var selectedDevice: AudioDeviceInfo? = null
for (device in devices) {
if (device.type == userSelectedDeviceType) {
selectedDevice = device
break
}
}
Java
// Get list of currently available devices
List devices = audioManager.getAvailableCommunicationDevices();
// User choose one of the devices, for example, TYPE_BLE_HEADSET
int userSelectedDeviceType = AudioDeviceInfo.TYPE_BLE_HEADSET;
// Filter for the device from the list
AudioDeviceInfo selectedDevice = null;
for (AudioDeviceInfo device : devices) {
if (device.getType() == userSelectedDeviceType) {
selectedDevice = device;
break;
}
}
设置通信设备
找到兼容的设备后,请使用 setCommunicationDevice 设置要通过路线接收设备的设备。检查结果会告知您的应用音频管理器正在尝试设置设备,还是遇到错误。
Kotlin
val result = audioManager.setCommunicationDevice(selectedDevice)
if (!result) {
// Handle error.
}
// Wait for currentCommunicationDevice to become selectedDevice with a timeout (e.g. 30s)
Java
boolean result = audioManager.setCommunicationDevice(selectedDevice);
if (!result) {
// Handle error.
}
// Wait for currentCommunicationDevice to become selectedDevice with a timeout (e.g. 30s)
注意 :设置通信设备后,请等待最多 30 秒。除非出现错误,否则会在 30 秒内调用 AudioDeviceCallback。如果发生错误,请调用 clearCommuncationDevice(),然后调用 setCommunicationDevice()。
BLE 音频设备现已设置完毕,在拨打电话时,音频流将拥有正确的音频路由。
结束会话
在应用完成通话或会话后,清除处于活动状态的通信设备。这有助于确保用户在不同应用之间切换时获得良好的体验。
Kotlin
// Clear the selection, ready for next call
audioManager.clearCommunicationDevice()
Java
// Clear the selection, ready for next call
audioManager.clearCommunicationDevice();
本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2023-11-06。