如何录制蓝牙耳机音频?

时间:2014-04-07 18:56:53

标签: android audio bluetooth

我想录制蓝牙耳机的音频。我搜索这个,我在这个网站上找到了相关信息。例如; 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();
        }
   }
}

但程序使用内置麦克风。我如何使用蓝牙耳机音频?

感谢。

2 个答案:

答案 0 :(得分:5)

根据android引用AudioManager.startBluetoothSco()使用startBluetoothSco()启动音频连接,并使用setSpeakerphoneOn(false)停止Android设备扬声器。首先通过蓝牙将手机连接到设备。这是一个例子。

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

现在根据要求启动,停止和播放音频。

{{1}}

Click here to get the full source code.

答案 1 :(得分:0)

要从蓝牙录制,您必须在录制开始时将默认手机麦克风更改为耳机麦克风这可以通过蓝牙()来完成。

private static void startBluetoothRecording(
        final OnBluetoothRecording BluetoothRecording,
        final boolean resume, Context context) {
    // TODO Auto-generated method stub

    final int MAX_ATTEPTS_TO_CONNECT = 3;
    final AudioManager audioManager = (AudioManager) context
            .getSystemService(Context.AUDIO_SERVICE);

    final CountDownTimer timer = getTimer(BluetoothRecording, audioManager,
            resume);

    context.registerReceiver(new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {

            int state = intent.getIntExtra(
                    AudioManager.EXTRA_SCO_AUDIO_STATE, -1);
            if (AudioManager.SCO_AUDIO_STATE_CONNECTED == state) {
                // cancel Timer
                timer.cancel();
                context.unregisterReceiver(this);

                // pass through and true because
                // recording from bluetooth so set 8000kHz

                BluetoothRecording.onStartRecording(resume, true);

            } else if (AudioManager.SCO_AUDIO_STATE_DISCONNECTED == state) {
                if (count > MAX_ATTEPTS_TO_CONNECT) {
                    context.unregisterReceiver(this);
                    // Stop BluetoothSCO
                    audioManager.stopBluetoothSco();
                    // reset Counter
                    count = 0;
                    // stop timer
                    timer.cancel();
                    // false because still recording not started
                    BluetoothRecording.onStartRecording(resume, false);
                } else {
                    // Increment Disconnect state Count
                    count++;

                }
            }

        }
    }, new IntentFilter(AudioManager.ACTION_SCO_AUDIO_STATE_UPDATED));

    // Start the timer
    timer.start();
    audioManager.startBluetoothSco();

}

For full class goto this link