오디오 관리자 자체 관리 통화 가이드

이 가이드에서는 오디오 및 들을 수 있는 기기 상태를 자체 관리하려는 VoIP (Voice over Internet Protocol)와 같은 통신 애플리케이션에 대해 설명합니다.

오디오 콜백 등록

먼저 오디오 기기가 기기와 연결되거나 연결 해제될 때 앱에 알리는 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();