Как записать звук с помощью 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-гарнитура и / или б) использовать гарнитуру bluetooth в качестве источника звука для медиа-рекордера?

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" /> 

В вашем файле манифеста. Без этого вы не получите сообщение об ошибке, но состояние просто не изменится на подключенное.

В соответствии с документацией вам нужно запустить аудиосоединение SCO с AudioManager.startBluetoothSco () , и тогда вам кажется, что вам нужно использовать MediaRecorder.AudioSource.VOICE_CALL .

Насколько я вижу, вы не можете выбрать конкретное устройство и т. Д. Это выполняется на системном уровне, то есть после того, как пользователь соединит гарнитуру с телефоном.

РЕДАКТИРОВАТЬ:

Как упоминалось Стефаном, AudioSource должен быть MIC.

VOICE_CALL, похоже, не работает.

Вы можете обнаружить подключенные устройства 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