Perfis de áudio Bluetooth baseados no áudio Bluetooth de baixa energia (BLE) permitem um streaming bidirecional de áudio de alta qualidade (por exemplo, áudio estéreo com taxa de amostragem de 32 kHz). Isso é possível graças à criação da LE Canal isócrono (ISO). O ISO é semelhante ao modo síncrono (SCO) porque também usa largura de banda sem fio reservada, mas a largura de banda reserva não tem mais limite de 64 Kbps e pode ser ajustada dinamicamente.
A entrada de áudio Bluetooth pode usar API AudioManager para quase todos os usos os casos, exceto chamadas telefônicas. Este guia aborda como gravar áudio estéreo de Áudio BLE auditável.
Configurar seu aplicativo
Primeiro, configure seu aplicativo para direcionar o SDK correto em build.gradle
:
targetSdkVersion 31
Registrar callback de áudio
Crie um
AudioDeviceCallback
que informa ao aplicativo as mudanças nos dispositivos
AudioDevices
.
final AudioDeviceCallback audioDeviceCallback = new AudioDeviceCallback() {
@Override
public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
};
@Override
public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {
// Handle device removal
};
};
audioManager.registerAudioDeviceCallback(audioDeviceCallback);
Encontrar dispositivo de áudio BLE
Confira uma lista de todos os dispositivos de áudio conectados com entrada compatível e use
getType()
para ver se
o dispositivo é um fone de ouvido usando
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; } }
Suporte estéreo
Para verificar se o dispositivo selecionado é compatível com microfones estéreos, confira se o dispositivo tem dois ou mais canais. Se o dispositivo tiver apenas um canal, defina a máscara de canais como 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; };
Configurar o gravador de áudio
Os gravadores de áudio podem ser configurados usando o builder AudioRecord
padrão.
Use a máscara de canais para selecionar a configuração estéreo ou 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();
Definir dispositivo preferido
A definição de um dispositivo preferido informa ao recorder
de áudio qual dispositivo de áudio
que você quer usar na gravação.
Kotlin
recorder.preferredDevice = audioDevice
Java
recorder.setPreferredDevice(bleInputDevice);
Agora você pode gravar áudio conforme descrito no guia do MediaRecorder.