音訊管理工具自行管理通話指南

本指南介紹的通訊應用程式,例如想自行管理音訊與可聽裝置狀態的通訊應用程式,例如 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();