このガイドでは、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 オーディオをサポートする最初のデバイスを検索しますが、サポートされているすべてのデバイスを見つけて、ユーザーが選択できるようにすることもできます。
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 オーディオ機器が設定されたので、発信時に音声ストリームに正しいオーディオ ルーティングが設定されます。
セッションを終了する
アプリで通話またはセッションが終了したら、アクティブな通信デバイスを消去します。これにより、異なるアプリケーション間を移動する際に優れたユーザー エクスペリエンスを確保できます。
Kotlin
// Clear the selection, ready for next call
audioManager.clearCommunicationDevice()
Java
// Clear the selection, ready for next call
audioManager.clearCommunicationDevice();