Android – 通过听筒播放audio

我目前有代码,使用AudioRecord类从设备麦克风中读取录音,然后使用AudioTrack类将其播放出去。

我的问题是,当我演奏它通过扬声器电话播放。

我希望通过设备上的耳塞播放。

这是我的代码:

public class LoopProg extends Activity { boolean isRecording; //currently not used AudioManager am; int count = 0; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); am = (AudioManager) getSystemService(Context.AUDIO_SERVICE); am.setMicrophoneMute(true); while(count <= 1000000){ Record record = new Record(); record.run(); count ++; Log.d("COUNT", "Count is : " + count); } } public class Record extends Thread{ static final int bufferSize = 200000; final short[] buffer = new short[bufferSize]; short[] readBuffer = new short[bufferSize]; public void run() { isRecording = true; android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); int buffersize = AudioRecord.getMinBufferSize(11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); AudioRecord arec = new AudioRecord(MediaRecorder.AudioSource.MIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, buffersize); AudioTrack atrack = new AudioTrack(AudioManager.STREAM_MUSIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, buffersize, AudioTrack.MODE_STREAM); am.setRouting(AudioManager.MODE_NORMAL,1, AudioManager.STREAM_MUSIC); int ok = am.getRouting(AudioManager.ROUTE_EARPIECE); Log.d("ROUTING", "getRouting = " + ok); setVolumeControlStream(AudioManager.STREAM_VOICE_CALL); //am.setSpeakerphoneOn(true); Log.d("SPEAKERPHONE", "Is speakerphone on? : " + am.isSpeakerphoneOn()); am.setSpeakerphoneOn(false); Log.d("SPEAKERPHONE", "Is speakerphone on? : " + am.isSpeakerphoneOn()); atrack.setPlaybackRate(11025); byte[] buffer = new byte[buffersize]; arec.startRecording(); atrack.play(); while(isRecording) { arec.read(buffer, 0, buffersize); atrack.write(buffer, 0, buffer.length); } arec.stop(); atrack.stop(); isRecording = false; } } } 

正如你可以看到,如果我已经尝试使用AudioManager类和其方法,包括弃用setRouting方法的代码,并没有任何工作,setSpeakerphoneOn方法似乎没有任何效果,路由方法也没有。

有没有人有任何想法如何让它通过耳机,而不是手机?

刚刚得到它在2.2的工作。 我仍然需要In_Call设置,我不太喜欢,但我现在就处理它。 我能够抛弃呼叫路由的东西,现在已经弃用了。 我发现你一定需要Modify_Audio_Settings权限,没有它的setSpeakerPhone没有错误,但是setSpeakerPhone方法什么都不做。 这是我使用的代码的模拟。

 private AudioManager m_amAudioManager; m_amAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); m_amAudioManager.setMode(AudioManager.MODE_IN_CALL); m_amAudioManager.setSpeakerphoneOn(false); 

最近这个问题有一些相关的讨论:
Android – 我可以静音当前正在播放audio应用程序?

基于AudioManager源代码,在setSpeakerphoneOn方法有效之前,您似乎必须处于“调用模式”。

不过,我最近看到一个应用程序,可以无缝切换听筒和扬声器,同时仍然显示当前stream为“媒体”stream,所以我会有兴趣的任何进一步的答案。

这里有一些答案误导了很多时间。 我正在使用Android 2.2。 “audioManager.setSpeakerphoneOn(假);” 工作中。

 audioManager.setSpeakerphoneOn(false); ... mediaPlayer.setDataSource(..); mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); mediaPlayer.prepare(); 

请使用此代码,效果很好:

  //PLAY ON EARPIECE mPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); audioManager.setMode(AudioManager.MODE_IN_CALL); audioManager.setSpeakerphoneOn(false); //PLAY ON SPEAKER mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); audioManager.setMode(AudioManager.MODE_IN_CALL); audioManager.setSpeakerphoneOn(true); 
 public MediaPlayer m_mpSpeakerPlayer; private AudioManager m_amAudioManager; m_amAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); // 從Receiver Earpiece發音m_amAudioManager.setSpeakerphoneOn(false); m_amAudioManager.setRouting(AudioManager.MODE_NORMAL, AudioManager.ROUTE_EARPIECE, AudioManager.ROUTE_ALL); Log.i(TAG, String.valueOf(m_amAudioManager.getRouting(AudioManager.ROUTE_EARPIECE))); setVolumeControlStream(AudioManager.STREAM_VOICE_CALL); // 把聲音設定成從Earpiece出來// 重點在這行,要把它設定為正在通話中m_amAudioManager.setMode(AudioManager.MODE_IN_CALL); // 開始放音樂m_mpSpeakerPlayer.reset(); m_mpSpeakerPlayer.setDataSource("sdcard/receiver.mp3"); m_mpSpeakerPlayer.prepare(); m_mpSpeakerPlayer.start(); //最後再把它設定從Speaker放音,達成! m_amAudioManager.setMode(AudioManager.MODE_NORMAL); 

我似乎在1.6上工作。

所以我说我会在这里发表我是如何做到的。

为了让它在1.6中工作,我:

使用AudioManager类设置setSpeakerphoneOn(false) ,然后使用Voice_Call_Stream并将音量控制添加到Voice_Call_Stream

在活动的onCreate()中使用setSpeakerphoneOn(false)方法,这似乎是路由到耳机,然后我使用一个button,并使用setSpeakerphoneOn(true)方法,audio路由到扬声器。

这个方法在我用onCreate()时候才会出现,我还没有对它进行广泛的testing,但是现在它允许我在1.6设备上的耳机和扬声器之间切换

如果耳机连接到蓝牙手机(我认为这是),你有没有试过调用AudioManager.setBluetoothScoOn(true)

我已经通过Android的参考,这是唯一我能find你没有提到的尝试。