Mises à jour de l'API de routage audio dans Android 14 pour les applications VoIP

Android 14 a introduit des mises à jour d'API accompagnées de modifications de l'expérience utilisateur sur le comportement de routage audio pour les appareils Bluetooth LE Audio (LEA), y compris les appareils auditifs. Ces modifications ont eu un impact sur la façon dont les applications VoIP gèrent la sélection de la sortie audio. Ce document fournit des informations essentielles aux développeurs pour qu'ils adaptent leurs applications VoIP à ces modifications et garantissent une expérience utilisateur fluide.

Changement de comportement dans Android 14

  • Le routage des appareils LEA:les appareils LEA sont désormais activés par défaut sur les téléphones Pixel et AOSP. Toutefois, pour reconnaître et sélectionner activement les appareils LEA comme sortie audio, les applications doivent utiliser les nouvelles API introduites au niveau d'API 31.
  • Acheminement vers les prothèses auditives:auparavant, l'audio était toujours par défaut dirigé vers les prothèses auditives, même si l'utilisateur avait sélectionné explicitement l'écouteur. Sous Android 14, les appareils auditifs sont désormais présentés comme l'une des options de sortie audio disponibles, ce qui nécessite une sélection explicite de la part de l'utilisateur.

Justification du changement

  • Avant Android 12, il n'existait aucune API permettant d'utiliser explicitement des appareils auditifs pour les appels, ce qui entraînait l'utilisation par défaut des appareils auditifs pour l'audio lorsqu'ils étaient connectés.
  • Il était donc difficile pour les utilisateurs de passer des appareils auditifs aux écouteurs sans les déconnecter.
  • Le même problème s'applique aux casques Bluetooth LE Audio.

Pour relever ces défis, Android 14 a introduit des modifications afin de fournir aux applications VoIP un meilleur contrôle du routage audio et de garantir un comportement cohérent entre les accessoires Bluetooth.

Principales modifications d'Android 14

  • API génériques pour la sélection d'itinéraires:Android 12 a lancé AudioManager.setCommunicationDevice pour permettre aux applications de spécifier des itinéraires audio, y compris pour les appareils auditifs et les appareils LEA. Toutefois, dans Android 12 et 13, les appareils auditifs n'étaient pas visibles en tant qu'appareils, ce qui limitait l'utilité de cette API.
  • Visibilité des appareils auditifs:sous Android 14, les appareils auditifs sont désormais visibles en tant qu'appareils, ce qui permet aux applications de fournir des éléments d'interface utilisateur permettant aux utilisateurs de sélectionner leur sortie audio préférée.
  • Abandons d'API:plusieurs API liées au routage audio ont été abandonnées dans Android 14. Les développeurs doivent migrer vers les nouvelles API introduites au niveau d'API 31 pour gérer efficacement la sélection de la sortie audio.

Actions requises du développeur

  • Recommandé:migrez vers la bibliothèque Jetpack Telecom. Si possible, migrez votre application VoIP vers la bibliothèque Telecom Jetpack pour simplifier la gestion du routage audio.
  • Utilisez setCommunicationDevice() ou les dernières API (listées ci-dessous) si la migration n'est pas possible.

API obsolètes et leurs remplacements

Obsolète dans Android 14 Nouvelles 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()

Plate-forme:
CallEventCallback.onAvailableCallEndpointsChanged()
CallEventCallback.onCallEndpointChanged()
CallEventCallback.onMuteStateChanged()
Connection.onCallAudioStateChanged()
Connection.requestBluetoothAudio() Jetpack:
CallControlScope#requestEndpointChange()

Plate-forme:
CallControl#requestCallEndpointChange()
Connection.setAudioRoute()