En esta guía, se explica cómo enrutar audio para dispositivos Bluetooth con la API de Telecom y configurar la conexión para llamadas de VoIP. Antes de continuar, lee la guía Cómo compilar una app de llamadas.
Cuando usas las clases ConnectionService
y Connection
, puedes acceder al estado de audio y a una lista de dispositivos Bluetooth disponibles, además de enrutar el audio a un dispositivo Bluetooth seleccionado.
Conexión y ConnectionService de VoIP
Crea una clase VoIPConnection
que se extienda desde Connection
. Esta clase controla el estado de la llamada actual. Como se indica en la guía Cómo compilar una app de llamada, haz que esta sea una aplicación autoadministrada y configura el modo de audio para una aplicación de VoIP.
Kotlin
class VoIPConnection : Connection() { init { setConnectionProperties(PROPERTY_SELF_MANAGED) setAudioModeIsVoip(true) } }
Java
public class VoIPConnection extends Connection { public VoIPConnection() { setConnectionProperties(PROPERTY_SELF_MANAGED); setAudioModeIsVoip(true); } }
A continuación, muestra una instancia de esta clase en ConnectionService
cuando se produzca una llamada entrante o saliente.
Kotlin
class VoIPConnectionService : ConnectionService() { override fun onCreateOutgoingConnection( connectionManagerPhoneAccount: PhoneAccountHandle, request: ConnectionRequest, ): Connection { return VoIPConnection() } }
Java
public class VoIPConnectionService extends ConnectionService { @Override public Connection onCreateOutgoingConnection(PhoneAccountHandle connectionManagerPhoneAccount, ConnectionRequest request) { return new VoIPConnection(); } }
Asegúrate de que el manifiesto apunte correctamente a la clase VoIPConnectionService
.
<service android:name=".voip.TelegramConnectionService" android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE">
<intent-filter>
<action android:name="android.telecom.ConnectionService"/>
</intent-filter>
</service>
Con estas clases personalizadas de Connection
y ConnectionService
, puedes controlar qué dispositivo y qué tipo de enrutamiento de audio deseas usar durante una llamada.
Cómo obtener el estado actual del audio
Para obtener el estado del audio actual, llama a getCallAudioState()
.
Se muestra getCallAudioState()
si el dispositivo está transmitiendo con Bluetooth, Auricular, Con cable o Bocina.
mAudioState = connection.getCallAudioState()
Cuando se cambia el estado
Suscribirse a los cambios en CallAudioState anulando onCallAudioStateChanged()
.
Esto te alerta sobre cualquier cambio en el estado.
Kotlin
fun onCallAudioStateChanged(audioState: CallAudioState) { mAudioState = audioState }
Java
@Override public void onCallAudioStateChanged(CallAudioState audioState) { mAudioState = audioState; }
Obtén el dispositivo actual
Obtén el dispositivo activo actual con CallAudioState.getActiveBluetoothDevice()
.
Esta función muestra el dispositivo Bluetooth activo.
Kotlin
val activeDevice: BluetoothDevice = mAudioState.getActiveBluetoothDevice()
Java
BluetoothDevice activeDevice = mAudioState.getActiveBluetoothDevice();
Obtener dispositivos Bluetooth
Obtén una lista de los dispositivos Bluetooth disponibles para el enrutamiento de audio de llamadas mediante CallAudioState.getSupportedBluetoothDevices()
.
Kotlin
val availableBluetoothDevices: Collection= mAudioState.getSupportedBluetoothDevices()
Java
CollectionavailableBluetoothDevices = mAudioState.getSupportedBluetoothDevices();
Enrutar el audio de la llamada
Usar el nivel de API 28 y versiones posteriores (recomendado)
Enruta el audio de la llamada a un dispositivo Bluetooth disponible mediante requestBluetoothAudio(BluetoothDevice)
:
requestBluetoothAudio(availableBluetoothDevices[0]);
Uso del nivel de API 23 y versiones posteriores
Habilita ROUTE_BLUETOOTH
sin especificar el dispositivo mediante setAudioRoute(int)
.
De forma predeterminada, el enrutamiento a dispositivos Bluetooth actuales y activos en Android 9 y versiones posteriores
setAudioRoute(CallAudioState.ROUTE_BLUETOOTH);