Gravação de áudio

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.