Os perfis de áudio Bluetooth baseados em áudio Bluetooth de baixa energia (BLE) permitem o streaming bidirecional de áudio de alta qualidade (por exemplo, áudio estéreo com taxa de amostragem de 32 kHz). Isso foi possível graças à criação do LE Isochronous Channel (ISO). O ISO é semelhante ao link síncrono orientado a conexão (SCO, na sigla em inglês) porque também usa largura de banda sem fio reservada, mas a reserva de largura de banda não é mais limitada a 64 Kbps e pode ser ajustada dinamicamente.
A entrada de áudio Bluetooth pode usar a API AudioManager mais recente para quase todos os casos de uso, exceto chamadas telefônicas. Este guia aborda como gravar áudio estéreo de audíveis BLE de áudio.
Configurar seu aplicativo
Primeiro, configure o aplicativo para ser direcionado ao SDK correto em build.gradle
:
targetSdkVersion 31
Registrar callback de áudio
Crie um
AudioDeviceCallback
que informe ao seu aplicativo sobre mudanças no AudioDevices
conectado ou
desconectado.
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 que têm suporte de entrada e use
getType()
para conferir 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; } }
Compatibilidade com estéreo
Para verificar se o dispositivo selecionado tem suporte a microfones estéreo, confira se ele 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 canal 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 com qual dispositivo
você quer gravar.
Kotlin
recorder.preferredDevice = audioDevice
Java
recorder.setPreferredDevice(bleInputDevice);
Agora você pode gravar áudio conforme descrito no guia do MediaRecorder.