Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to record bluetooth headset audio?

I want to record audio from bluetooth headset. I search this and i find sources in this site about that. For example; How to record sound using bluetooth headset Android MediaRecorder to AudioTrack, Recording and Playback Text-To-Speech over bluetooth

public class MainActivity extends Activity {

   private MediaRecorder myRecorder;
   private MediaPlayer myPlayer;
   private String outputFile = null;
   private Button startBtn;
   private Button stopBtn;
   private Button playBtn;
   private Button stopPlayBtn;
   private TextView text;
   private AudioManager amanager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    amanager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

    text = (TextView) findViewById(R.id.text1);
      // store it to sd card
      outputFile = Environment.getExternalStorageDirectory().
              getAbsolutePath() + "/javacodegeeksRecording.3gpp";

      myRecorder = new MediaRecorder();
      myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
      myRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
      myRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
      myRecorder.setOutputFile(outputFile);

      startBtn = (Button)findViewById(R.id.start);
      startBtn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            start(v);
        }
      });

      stopBtn = (Button)findViewById(R.id.stop);
      stopBtn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            stop(v);
        }
      });

      playBtn = (Button)findViewById(R.id.play);
      playBtn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
                play(v);    
        }
      });

      stopPlayBtn = (Button)findViewById(R.id.stopPlay);
      stopPlayBtn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            stopPlay(v);
        }
      });
}
public void start(View view){
       try {
          amanager.setMode(AudioManager.MODE_IN_CALL);
          amanager.startBluetoothSco();
          myRecorder.prepare();
          myRecorder.start();
       } catch (IllegalStateException e) {
          // start:it is called before prepare()
          // prepare: it is called after start() or before setOutputFormat() 
          e.printStackTrace();
       } catch (IOException e) {
           // prepare() fails
           e.printStackTrace();
        }

       text.setText("Recording Point: Recording");
       startBtn.setEnabled(false);
       stopBtn.setEnabled(true);

       Toast.makeText(getApplicationContext(), "Start recording...", 
               Toast.LENGTH_SHORT).show();
   }

   public void stop(View view){
       try {
          myRecorder.stop();
          myRecorder.release();
          myRecorder  = null;

          stopBtn.setEnabled(false);
          playBtn.setEnabled(true);
          text.setText("Recording Point: Stop recording");

          Toast.makeText(getApplicationContext(), "Stop recording...",
                  Toast.LENGTH_SHORT).show();
       } catch (IllegalStateException e) {
            //  it is called before start()
            e.printStackTrace();
       } catch (RuntimeException e) {
            // no valid audio/video data has been received
            e.printStackTrace();
       }
   }

   public void play(View view) {
       try{
           myPlayer = new MediaPlayer();
           myPlayer.setDataSource(outputFile);
           myPlayer.prepare();
           myPlayer.start();

           playBtn.setEnabled(false);
           stopPlayBtn.setEnabled(true);
           text.setText("Recording Point: Playing");

           Toast.makeText(getApplicationContext(), "Start play the recording...", 
                   Toast.LENGTH_SHORT).show();
       } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
   }

   public void stopPlay(View view) {
       try {
           if (myPlayer != null) {
               myPlayer.stop();
               myPlayer.release();
               myPlayer = null;
               playBtn.setEnabled(true);
               stopPlayBtn.setEnabled(false);
               text.setText("Recording Point: Stop playing");

               Toast.makeText(getApplicationContext(), "Stop playing the recording...", 
                       Toast.LENGTH_SHORT).show();
           }
       } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
   }
}

But program use in-built microphone. How can i use bluetooth headset audio?

Thanks.

like image 574
gamzesongl Avatar asked Apr 07 '14 18:04

gamzesongl


People also ask

Can Bluetooth earphones be used for recording?

Actually all. Every Bluetooth pair that has a mic with them can be used for recording. When you connect the pair with the mobile/desktop, the source of audio input is automatically changed. If not, Go to the application audio settings, and you'll find the option to change audio input, change it to the headphones.


1 Answers

As per android reference AudioManager.startBluetoothSco() start audio connection using startBluetoothSco() and stop android device speaker by using setSpeakerphoneOn(false). First connect your phone to device through bluetooth. Here is example for that.

Add permission "android.permission.MODIFY_AUDIO_SETTINGS" in manifest file.

private BroadcastReceiver mBluetoothScoReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        int state = intent.getIntExtra(AudioManager.EXTRA_SCO_AUDIO_STATE, -1);
        System.out.println("ANDROID 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();
             */
        }
    }
};

 @Override
protected void onResume() {
    super.onResume();
    IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED);
    registerReceiver(mBluetoothScoReceiver, intentFilter);
    audioManager = (AudioManager) getApplicationContext().getSystemService(getApplicationContext().AUDIO_SERVICE);
    // Start Bluetooth SCO.
    audioManager.setMode(audioManager.MODE_NORMAL);
    audioManager.setBluetoothScoOn(true);
    audioManager.startBluetoothSco();
    // Stop Speaker.
    audioManager.setSpeakerphoneOn(false);

}

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(mBluetoothScoReceiver);
    // Stop Bluetooth SCO.
    audioManager.stopBluetoothSco();
    audioManager.setMode(audioManager.MODE_NORMAL);
    audioManager.setBluetoothScoOn(false);
    // Start Speaker.
    audioManager.setSpeakerphoneOn(true);
}

Now start, stop and play audio based on requirement.

buttonStartRecording.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // Check audio permission
            if (checkPermission()) {
                AudioSavePathInDevice =
                        Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + "AudioRecording.3gp";
                // Start Media recorder
                MediaRecorderReady();
                try {
                    mediaRecorder.prepare();
                    mediaRecorder.start();
                } catch (IllegalStateException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                buttonStartRecording.setEnabled(false);
                buttonStopRecording.setEnabled(true);

                Toast.makeText(MainActivityOne.this, "Recording started",
                        Toast.LENGTH_LONG).show();
            } else {
                requestPermission();
            }

        }
    });

    buttonStopRecording.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            buttonStopRecording.setEnabled(false);
            buttonPlayLastRecordAudio.setEnabled(true);
            buttonStartRecording.setEnabled(true);
            buttonStopPlayingRecording.setEnabled(false);
            // Stop Media recorder
            mediaRecorder.stop();
            Toast.makeText(MainActivityOne.this, "Recording Completed",
                    Toast.LENGTH_LONG).show();
        }
    });

    buttonPlayLastRecordAudio.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) throws IllegalArgumentException,
                SecurityException, IllegalStateException {
            int selectedId = mRadioGroup.getCheckedRadioButtonId();
            if (selectedId == R.id.radioButton) {
                isAudioPlayInSameDevice = true;
            } else {
                isAudioPlayInSameDevice = false;
            }
            // if you want to play audio on your Mobile speaker then set isAudioPlayInSameDevice true
            // and if you want to play audio to connected device then set isAudioPlayInSameDevice false.
            if (isAudioPlayInSameDevice) {
                audioManager.setMode(audioManager.STREAM_MUSIC);
                audioManager.setSpeakerphoneOn(true);
            } else {
                audioManager.setSpeakerphoneOn(false);
                audioManager.setMode(audioManager.MODE_NORMAL);
            }
            audioManager.setBluetoothScoOn(false);
            audioManager.stopBluetoothSco();
            buttonStopRecording.setEnabled(false);
            buttonStartRecording.setEnabled(false);
            buttonStopPlayingRecording.setEnabled(true);

            mediaPlayer = new MediaPlayer();
            try {
                // Start media player
                System.out.println("Recorded Audio Path-" + AudioSavePathInDevice);
                mediaPlayer.setDataSource(AudioSavePathInDevice);
                if (isAudioPlayInSameDevice) {
                    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                }
                mediaPlayer.prepare();
                mediaPlayer.start();
            } catch (IOException e) {
                e.printStackTrace();
            }
            Toast.makeText(MainActivityOne.this, "Recording Playing",
                    Toast.LENGTH_LONG).show();
        }
    });

    buttonStopPlayingRecording.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            buttonStopRecording.setEnabled(false);
            buttonStartRecording.setEnabled(true);
            buttonStopPlayingRecording.setEnabled(false);
            buttonPlayLastRecordAudio.setEnabled(true);

            if (mediaPlayer != null) {
                // Stop Media Player
                mediaPlayer.stop();
                mediaPlayer.release();
                MediaRecorderReady();
            }
        }
    });

    public void MediaRecorderReady() {
        mediaRecorder = new MediaRecorder();
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
        mediaRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
        mediaRecorder.setOutputFile(AudioSavePathInDevice);
    }

Click here to get the full source code.

like image 128
Jaydip Meghapara Avatar answered Sep 29 '22 12:09

Jaydip Meghapara