programacion - Android-Reproducir audio desde el auricular
programacion android pdf 2018 (7)
¿Qué tal esto entonces?
// Make sure that streams following the PHONE routing strategy aren''t forced
// to play in the speaker.
Class audioSystemClass = Class.forName("android.media.AudioSystem");
Method setForceUse = audioSystemClass.getMethod("setForceUse",
int.class,
int.class);
// First 0 == FOR_COMMUNICATION, second 0 == FORCE_NONE.
setForceUse.invoke(null, 0, 0);
Luego usa STREAM_VOICE_CALL
para tu MediaPlayer.
Si la llamada a setForceUse
correctamente y el audio de su MediaPlayer aún se reproduce en el altavoz, diría que algo está mal en la implementación de AudioPolicyManager en el teléfono / tableta en el que está probando esto.
Me gustaría reproducir el audio de un archivo en el auricular del teléfono (o los auriculares que están conectados) utilizando el Android MediaPlayer
. Intenté usar el truco MODE_IN_CALL como se sugiere en este hilo: Android: hacer que el audio se reproduzca a través del auricular, pero eso no ayudó. La aplicación también tiene el permiso android.permission.MODIFY_AUDIO_SETTINGS , pero cualquier llamada a m_amAudioManager.setSpeakerphoneOn(false);
se ignora
private AudioManager m_amAudioManager;
m_amAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
m_amAudioManager.setMode(AudioManager.MODE_IN_CALL);
m_amAudioManager.setSpeakerphoneOn(false);
Una llamada a setMode(AudioManager.STREAM_VOICE_CALL);
en el MediaPlayer
tampoco ayudó.
mediaPlayer.reset();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
mediaPlayer.setDataSource(path);
mediaPlayer.prepare();
¿Ha cambiado algo desde Android 2.3 para romper este código? Probé el código en Android ICS sin ningún éxito. Alguien me puede apuntar en la dirección correcta ? El audio siempre se reproduce desde el altavoz del teléfono hasta el momento.
Descubrí que necesitaba configurar tanto el reproductor multimedia como el Audiomanager
private MediaPlayer mp = new MediaPlayer();
AudioManager mAudioManager = (AudioManager) v.getContext()
.getSystemService(Context.AUDIO_SERVICE);
mAudioManager.setSpeakerphoneOn(false);
mp.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
El siguiente código funciona bien para mí y lo he probado en varios dispositivos:
1- creando instancias:
MediaPlayer mPlayer = MediaPlayer.create(MainActivity.this, R.raw.skype_call_dialing);
AudioManager mAudioManager = ((AudioManager).getSystemService(Context.AUDIO_SERVICE));
2- si quieres ajustar el volumen al máximo (opcional)
int maxVolumeMusic = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, maxVolumeMusic, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
mAudioManager.setMode(AudioManager.STREAM_MUSIC);
3- configurar el audio para reproducir desde el auricular:
mAudioManager.setSpeakerphoneOn(false);
4- juego:
mPlayer.setLooping(true);
mPlayer.start();
¡¡¡¡Hecho!!!! Pero hay algunos consejos que voy a compartir con ustedes:
1- en el paso 2, si configura Audiomanager.setMode () antes de AudioManager.setStreamVolume (), entonces el volumen no se ajustaría al máximo!
2- si agrega mPlayer.prepare () antes de mPlayer.setLooping (true); ¡podría provocar un fallo !, no deberías usar mPlayer.prepare () mientras que mPlayer se está inicializando así:
MediaPlayer mPlayer = MediaPlayer.create(MainActivity.this, R.raw.skype_call_dialing);
3- en el paso 2, mAudioManager.setMode () Utilicé AudioManager.STREAM_MUSIC, cuando intento otros modos, en muchos casos no pude encender y apagar el altavoz.
Ok, en mi caso, el problema se resolvió utilizando el siguiente código
mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
mAudioManager.setSpeakerphoneOn(false);
Resulta que la forma correcta de hacerlo es a través del siguiente código.
Juega a través del auricular
mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
Juega a través del altavoz del teléfono
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
Eso es. Cualquier otra solución (incluida la publicada aquí -> Android - Obtener audio para que se reproduzca a través del auricular ) no funciona de manera consistente en todos los dispositivos. De hecho, el uso de MODE_IN_CALL asegura que su audio nunca se reproducirá en ciertos dispositivos.
Nota: Necesitará volver a preparar el reproductor multimedia para cambiar las transmisiones.
Solo quería agregar un ejemplo completo para la Respuesta de Deepak Bala. Funciona cuando no se usa el método MediaPlayer.create ():
this.player = new MediaPlayer();
this.player.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
try {
this.player.setDataSource(getContext(), Uri.fromFile(new File(m.localFileUrl)));
this.player.prepare();
} catch (IllegalStateException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Este método está funcionando bien para mí.
Es necesario configurar el modo de administrador de audio también. y luego, utilizando la interfaz de usuario de audiomgr.setSpeakerphoneOn (false), puede alternar.
AudioManager audiomgr = (AudioManager)
context.getSystemService(Context.AUDIO_SERVICE);
audiomgr.setMode(AudioManager.STREAM_MUSIC);
audiomgr.setSpeakerphoneOn(false);