Android: cómo escuchar el audio a través del auricular

Actualmente tengo un código que lee una grabación desde el micrófono del dispositivo usando la clase AudioRecord y luego la reproduce con la clase AudioTrack.

Mi problema es que cuando juego, suena a través del altavoz del teléfono.

Quiero que se reproduzca a través del auricular en el dispositivo.

Aquí está mi código:

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

Como puede ver si el código que he intentado usar la clase AudioManager y sus métodos, incluido el método setRouting obsoleto, y nada funciona, el método setSpeakerphoneOn parece no tener ningún efecto, como tampoco lo hace el método de enrutamiento.

¿Alguien ha tenido alguna idea sobre cómo hacer que funcione a través del auricular en lugar del teléfono spaker?

Acabo de hacerlo funcionar en 2.2. Todavía necesitaba la configuración de In_Call que realmente no me gusta, pero me ocuparé de eso por el momento. Pude abandonar el enrutamiento de llamadas que ahora está en desuso. Descubrí que definitivamente necesitas el permiso Modify_Audio_Settings , sin errores, pero el método setSpeakerPhone simplemente no hace nada. Aquí está la maqueta del código que utilicé.

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

Hubo alguna discusión relacionada en esta reciente pregunta:
Android: ¿puedo silenciar las aplicaciones de audio que se están reproduciendo actualmente?

Según el código fuente de AudioManager , parece que debe estar en “modo de llamada” antes de que el método setSpeakerphoneOn tenga algún efecto.

Sin embargo, recientemente vi una aplicación que podía cambiar sin problemas entre el auricular y el altavoz al mismo tiempo que mostraba el flujo actual como el flujo de “medios”, por lo que estaría interesado en cualquier otra respuesta.

Avergonzado por algunas respuestas aquí por bastante tiempo. Estoy usando Android 2.2. “audioManager.setSpeakerphoneOn (false);” está trabajando.

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

Por favor use este código, funciona bien:

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

Parece que lo tengo trabajando en 1.6.

Entonces dije que publicaría aquí cómo lo hice.

Para que funcione en 1.6 I:

Usé la clase AudioManager para establecer setSpeakerphoneOn(false) , luego usé Voice_Call_Stream y Voice_Call_Stream control de volumen al Voice_Call_Stream .

El setSpeakerphoneOn(false) se usa en onCreate() de la actividad y parece que se dirige al auricular, luego usé un botón y usé el setSpeakerphoneOn(true) y el audio se enruta al hablante.

El método solo parece funcionar cuando se usa en onCreate() para mí y no lo he probado exhaustivamente, pero por el momento me permite cambiar entre auriculares y altavoces en un dispositivo de 1.6.

Si el auricular está conectado al teléfono con bluetooth (que supongo que es), ¿ha intentado llamar a AudioManager.setBluetoothScoOn(true) ?

He consultado la referencia de Android y esta es la única cosa que pude encontrar que no mencionaste intentar.