Los perfiles de audio Bluetooth basados en el audio Bluetooth de bajo consumo (BLE) permiten la transmisión bidireccional de audio de alta calidad (por ejemplo, audio estéreo con una tasa de muestreo de 32 kHz). Esto es posible gracias a la creación del canal isocrónico de LE (ISO). ISO es similar al vínculo síncrono orientado a la conexión (SCO) porque también usa el ancho de banda inalámbrico reservado, pero la reserva del ancho de banda ya no está limitada a 64 Kbps y se puede ajustar de forma dinámica.
La entrada de audio Bluetooth puede usar la API de AudioManager más reciente para casi todos los casos de uso, excepto las llamadas telefónicas. En esta guía, se explica cómo grabar audio estéreo desde dispositivos de audio BLE.
Configura tu aplicación
Primero, configura tu aplicación para que se oriente al SDK correcto en build.gradle
:
targetSdkVersion 31
Registrar devolución de llamada de audio
Crea un AudioDeviceCallback
que informe a tu aplicación sobre cualquier cambio en AudioDevices
conectado o desconectado.
final AudioDeviceCallback audioDeviceCallback = new AudioDeviceCallback() {
@Override
public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
};
@Override
public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {
// Handle device removal
};
};
audioManager.registerAudioDeviceCallback(audioDeviceCallback);
Cómo buscar un dispositivo de audio BLE
Obtén una lista de todos los dispositivos de audio conectados con entradas compatibles y, luego, usa getType()
para ver si el dispositivo es auriculares con AudioDeviceInfo.TYPE_BLE_HEADSET
.
Kotlin
val allDeviceInfo = audioManager.getDevices(GET_DEVICES_INPUTS) var bleInputDevice: AudioDeviceInfo? = null for (device in allDeviceInfo) { if (device.type == AudioDeviceInfo.TYPE_BLE_HEADSET) { bleInputDevice = device break } }
Java
AudioDeviceInfo[] allDeviceInfo = audioManager.getDevices(GET_DEVICES_INPUTS); AudioDeviceInfo bleInputDevice = null; for (AudioDeviceInfo device : allDeviceInfo) { if (device.getType() == AudioDeviceInfo.TYPE_BLE_HEADSET) { bleInputDevice = device; break; } }
Compatibilidad con estéreo
Para verificar si el dispositivo seleccionado admite micrófonos estéreo, verifica si el dispositivo tiene dos o más canales. Si el dispositivo solo tiene un canal, establece la máscara de canal en mono.
Kotlin
var channelMask: Int = AudioFormat.CHANNEL_IN_MONO if (audioDevice.channelCounts.size >= 2) { channelMask = AudioFormat.CHANNEL_IN_STEREO }
Java
if (bleInputDevice.getChannelCounts() >= 2) { channelMask = AudioFormat.CHANNEL_IN_STEREO; };
Cómo configurar la grabadora de audio
Las grabadoras de audio se pueden configurar con el compilador estándar de AudioRecord
.
Usa la máscara de canal para seleccionar la configuración estéreo o mono.
Kotlin
val recorder = AudioRecord.Builder() .setAudioSource(MediaRecorder.AudioSource.MIC) .setAudioFormat(AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setSampleRate(32000) .setChannelMask(channelMask) .build()) .setBufferSizeInBytes(2 * minBuffSizeBytes) .build()
Java
AudioRecord recorder = new AudioRecord.Builder() .setAudioSource(MediaRecorder.AudioSource.MIC) .setAudioFormat(new AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setSampleRate(32000) .setChannelMask(channelMask) .build()) .setBufferSizeInBytes(2*minBuffSizeBytes) .build();
Establecer dispositivo preferido
La configuración de un dispositivo preferido le indica al recorder
de audio con qué dispositivo deseas grabar.
Kotlin
recorder.preferredDevice = audioDevice
Java
recorder.setPreferredDevice(bleInputDevice);
Ahora, puedes grabar audio como se describe en la guía de MediaRecorder.