Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to record sound using bluetooth headset

Tags:

I am writing an android app for storing and managing voice memos with some basic metadata and tagging. When recording sound I use:

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 

This works well when using the phone in a normal fashion. However, it does not detect the presence of a bluetooth headset and still uses the phone's own microphone even when the headset is plugged in.

I also tried using MediaRecorder.AudioSource.DEFAULT, hoping it would automatically choose the correct source, but then no sound was recorded at all.

How can I a) detect if a bluetooth headset is plugged in and/or b) use a bluetooth headset as audio source for the media recorder?

like image 476
joepal Avatar asked Oct 26 '10 16:10

joepal


People also ask

Can you record using Bluetooth?

For most people, the exciting part of that is the ability to use Bluetooth headphones with Google Recorder. This would enable recording audio from wherever you are, even if the phone isn't nearby. Alternatively, you can also use a dedicated external microphone connected over USB or Bluetooth.


1 Answers

olivierg is basically right (AudioSource can still be MIC), some basic code would look like this:

    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(); 

This I stumbled upon this myself just again, I want to point out the importance of slott's comment to include the right permissions, most importantly to set

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> 

in your manifest file. Without it you will not get any error message but the state will simply not change to connected.

like image 108
Stephan Avatar answered Oct 24 '22 10:10

Stephan