本指南介紹的通訊應用程式,例如想自行管理音訊與可聽裝置狀態的通訊應用程式,例如 Voice over Internet Protocol (VoIP)。
註冊音訊回呼
首先請建立 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 Audio 的第一部裝置,但您也可以考慮找出所有支援的裝置,並讓使用者自行選擇。
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)
設定 BLE Audio 裝置後,當你撥打電話時,音訊串流將可正確轉送音訊。
結束工作階段
應用程式結束通話或工作階段後,請清除進行中的通訊裝置,有助於確保使用者在切換不同的應用程式時,能獲得良好體驗。
Kotlin
// Clear the selection, ready for next call
audioManager.clearCommunicationDevice()
Java
// Clear the selection, ready for next call
audioManager.clearCommunicationDevice();