Как записать звук с помощью Bluetooth-гарнитуры
Я пишу приложение Android для хранения и управления голосовыми заметками с некоторыми базовыми метаданными и тегами. При записи звука я использую:
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(currentRecordingFileName);
// and so on
Это хорошо работает при обычном использовании телефона. Однако он не обнаруживает наличие Bluetooth-гарнитуры и по-прежнему использует собственный микрофон телефона, даже когда гарнитура подключена.
Я также попытался использовать MediaRecorder.AudioSource.DEFAULT, надеясь, что он автоматически выберет правильный источник, но тогда звук вообще не записывался.
Как я могу определить, подключена ли Bluetooth-гарнитура и/или b) использовать гарнитуру bluetooth в качестве источника звука для медиа-рекордера?
Ответы
Ответ 1
olivierg в основном прав (AudioSource все еще может быть MIC), некоторый базовый код будет выглядеть так:
am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
int state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1);
Log.d(TAG, "Audio SCO state: " + state);
if (AudioManager.SCO_AUDIO_STATE_CONNECTED == state) {
/*
* Now the connection has been established to the bluetooth device.
* Record audio or whatever (on another thread).With AudioRecord you can record with an object created like this:
* new AudioRecord(MediaRecorder.AudioSource.MIC, 8000, AudioFormat.CHANNEL_CONFIGURATION_MONO,
* AudioFormat.ENCODING_PCM_16BIT, audioBufferSize);
*
* After finishing, don't forget to unregister this receiver and
* to stop the bluetooth connection with am.stopBluetoothSco();
*/
unregisterReceiver(this);
}
}
}, new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED));
Log.d(TAG, "starting bluetooth");
am.startBluetoothSco();
Это я снова наткнулся на это, я хочу указать на важность комментария slott, чтобы включить правильные разрешения, самое главное установить
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
в файле манифеста. Без этого вы не получите сообщение об ошибке, но состояние просто не изменится на подключенное.
Ответ 2
В соответствии с документацией вам нужно запустить аудиосоединение SCO с AudioManager.startBluetoothSco(), и тогда вам кажется, что вам нужно использовать MediaRecorder.AudioSource.VOICE_CALL.
Насколько я вижу, вы не можете выбрать конкретное устройство и т.д. Это выполняется на системном уровне, то есть после того, как пользователь соединит гарнитуру с телефоном.
EDIT:
Как упоминалось Стефаном, AudioSource должен быть MIC.
VOICE_CALL не работает.
Ответ 3
Вы можете обнаружить подключенные устройства Bluetooth следующим образом:
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
// If there are paired devices
if (pairedDevices.size() > 0) {
// Loop through paired devices
for (BluetoothDevice device : pairedDevices) {
// Add the name and address to an array adapter to show in a ListView
mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
}
}
Однако я не уверен, как вы делаете запись с гарнитуры, а не на обычный MIC