I profili audio Bluetooth basati su Bluetooth Low Energy (BLE) Audio consentono lo streaming bidirezionale di audio di alta qualità (ad esempio, audio stereo con una frequenza di campionamento di 32 kHz). Ciò è possibile grazie alla creazione del canale LE Isochronous (ISO). L'ISO è simile al link SCO (Synchronous Connection-Oriented) in quanto utilizza anch'esso una larghezza di banda wireless riservata, ma la prenotazione della larghezza di banda non è più limitata a 64 Kbps e può essere regolata dinamicamente.
L'input audio Bluetooth può utilizzare l'API AudioManager più recente per quasi tutti i casi d'uso, escluse le chiamate telefoniche. Questa guida spiega come registrare audio stereo da ascoltatori BLE Audio.
Configura la tua applicazione
Innanzitutto, configura l'applicazione in modo che abbia come target l'SDK corretto in build.gradle
:
targetSdkVersion 31
Registra callback audio
Crea un elemento AudioDeviceCallback
che informi l'applicazione di eventuali modifiche a AudioDevices
connesso o disconnessa.
final AudioDeviceCallback audioDeviceCallback = new AudioDeviceCallback() {
@Override
public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
};
@Override
public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {
// Handle device removal
};
};
audioManager.registerAudioDeviceCallback(audioDeviceCallback);
Trova dispositivo audio BLE
Ottieni un elenco di tutti i dispositivi audio connessi con input supportato, quindi utilizza getType()
per vedere se il dispositivo è un dispositivo audio che utilizza 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; } }
Supporto stereo
Per verificare se i microfoni stereo sono supportati sul dispositivo selezionato, controlla se quest'ultimo ha due o più canali. Se il dispositivo ha un solo canale, imposta la maschera del canale su 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; };
Configura il registratore audio
I registratori audio possono essere configurati utilizzando lo strumento per la creazione standard di AudioRecord
.
Utilizza la maschera del canale per selezionare la configurazione stereo 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();
Imposta dispositivo preferito
L'impostazione di un dispositivo preferito consente a recorder
di conoscere il dispositivo audio con cui vuoi registrare.
Kotlin
recorder.preferredDevice = audioDevice
Java
recorder.setPreferredDevice(bleInputDevice);
Ora puoi registrare l'audio come descritto nella guida di MediaRecorder.