VoIP 앱을 위한 Android 14의 오디오 라우팅 API 업데이트

Android 14에서는 보청기를 비롯한 블루투스 LE 오디오 (LEA) 기기의 오디오 라우팅 동작에 대한 사용자 환경 변경사항과 함께 API 업데이트를 도입했습니다. 이러한 변경사항은 VoIP 앱이 오디오 출력 선택을 관리하는 방식에 영향을 미쳤습니다. 이 문서에서는 개발자가 VoIP 앱을 이러한 변경사항에 맞게 조정하고 원활한 사용자 환경을 보장하는 데 필요한 정보를 제공합니다.

Android 14의 동작 변경사항

  • LEA 기기 라우팅: 이제 Pixel 휴대전화 및 AOSP에서 LEA 기기가 기본적으로 사용 설정됩니다. 그러나 LEA 기기를 오디오 출력으로 직접 인식하고 선택하려면 API 수준 31에 도입된 새로운 API를 사용해야 합니다.
  • 보청기 라우팅: 이전에는 사용자가 이어폰을 명시적으로 선택하더라도 오디오가 항상 보청기로 기본 설정되었습니다. 이제 Android 14에서는 사용자가 명시적으로 선택해야 하는 사용 가능한 오디오 출력 옵션 중 하나로 보청기가 표시됩니다.

변경 사유

  • Android 12 이전에는 통화에 보청기를 명시적으로 사용하는 API가 없었기 때문에 연결되면 오디오가 항상 보청기로 기본 설정되었습니다.
  • 이로 인해 사용자가 보청기를 분리하지 않고 보청기에서 스피커로 전환하기가 어려웠습니다.
  • 블루투스 LE 오디오 헤드셋에도 동일한 문제가 적용되었습니다.

이러한 문제를 해결하기 위해 Android 14에서는 VoIP 앱에 오디오 라우팅을 더 세부적으로 제어하고 블루투스 액세서리 전반에서 일관된 동작을 보장하는 변경사항을 도입했습니다.

Android 14의 주요 변경사항

  • 경로 선택을 위한 일반 API: Android 12에서는 앱이 보청기 및 LEA 기기를 비롯한 오디오 경로를 지정할 수 있도록 AudioManager.setCommunicationDevice를 도입했습니다. 그러나 Android 12 및 13에서는 보청기가 기기로 표시되지 않아 이 API의 유용성이 제한되었습니다.
  • 보청기 표시: 이제 Android 14에서 보청기가 기기로 표시되므로 앱에서 사용자가 원하는 오디오 출력을 선택할 수 있는 UI 요소를 제공할 수 있습니다.
  • API 지원 중단: Android 14에서 오디오 라우팅과 관련된 여러 API가 지원 중단되었습니다. 개발자는 오디오 출력 선택을 효과적으로 관리하려면 API 수준 31에서 도입된 새 API로 이전해야 합니다.

필요한 개발자 작업

  • 적극 권장: Telecom Jetpack 라이브러리로 이전하세요. 가능하면 VoIP 앱을 Telecom Jetpack 라이브러리로 이전하여 오디오 라우팅 관리를 간소화하세요.
  • 이전이 불가능하다면 setCommunicationDevice() 또는 최신 API (아래 나열)를 사용하세요.

지원 중단된 API 및 대체 API

Android 14에서 지원 중단됨 새로운 API
AudioManager.isBluetoothScoOn() AudioManager.getCommunicationDevice()
AudioManager.isSpeakerphoneOn()
AudioManager.setSpeakerphoneOn() AudioManager.setCommunicationDevice()
AudioManager.startBluetoothSco()
AudioManager.stopBluetoothSco() AudioManager.clearCommunicationDevice()를 호출하세요.
Connection.getCallAudioState() Jetpack:
CallControlScope.getAvailableEndpoints()
CallControlScope.getCurrentCallEndpoint()
CallControlScope#isMuted()

플랫폼:
CallEventCallback.onAvailableCallEndpointsChanged()
CallEventCallback.onCallEndpointChanged()
CallEventCallback.onMuteStateChanged()
Connection.onCallAudioStateChanged()를 사용하는 것이 좋습니다.
Connection.requestBluetoothAudio() Jetpack:
CallControlScope#requestEndpointChange()

플랫폼:
CallControl#requestCallEndpointChange()
Connection.setAudioRoute()