Android: reproducir audio desde el auricular
Me gustaría reproducir audio de un archivo en el auricular del teléfono (o auriculares de que está conectado) con el androide MediaPlayer
. Traté de usar el hack MODE_IN_CALL como se sugiere en este hilo – Android – Obtención de audio para reproducir a través de auricular, pero que 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
no ayuda tampoco.
- Android Support v7 MediaRouter a veces no funciona correctamente
- Alternativa de OpenSL ES en Android
- ¿Hay alguna manera de reemplazar o silenciar el sonido del obturador de la cámara en android?
- Cambiar la velocidad de reproducción de música en android
- Adición de efectos de audio personalizados al reproductor de audio de Android
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? He probado 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 teléfono de altavoz hasta el momento.
- Grabar y procesar audio simultáneamente con Thread en Android
- Desarrollo de Android: para saber qué aplicación está reproduciendo música actualmente
- Android: ¿Cómo generar una frecuencia?
- Procesamiento de audio en tiempo real en Android
- Android: Grabación de audio con visualización de nivel de voz
- Cómo detectar el perfil de audio AAC y garantizar la compatibilidad con Android
- El streaming de MediaPlayer de Android para el cambio de red
- Sonido de carga de Soundpool Ya existe un componente del nombre 'OMX.qcom.audio.decoder.aac', ignorando éste
Resulta que la forma correcta de hacerlo es a través del siguiente código.
Juega a través de la pieza de oído
mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
Reproducir a través del altavoz
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
Eso es. Cualquier otra solución (incluida la que se ha publicado aquí -> Android – Obtención de audio para reproducir a través del auricular ) no funciona de forma coherente entre dispositivos. De hecho, utilizando MODE_IN_CALL se asegura de que el audio nunca se reproduzca en ciertos dispositivos.
Nota: Deberá volver a preparar el reproductor multimedia para cambiar los flujos.
Sólo quería añadir un ejemplo completo de la respuesta de Deepak Bala. Funciona cuando no utiliza 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(); }
¿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);
A continuación, utilice STREAM_VOICE_CALL
para su MediaPlayer.
Si la llamada setForceUse
tiene éxito y el audio de su MediaPlayer sigue reproduciéndose en el altavoz, entonces diría que algo está desordenado en la implementación de AudioPolicyManager en el teléfono / tablet en el que está probando esto.
Encontré que necesitaba fijar el mediaplayer y 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);
Este método está funcionando bien para mí.
También debe configurar el modo de administrador de audio. Y luego utilizando audiomgr.setSpeakerphoneOn (falso) api puede alternar.
AudioManager audiomgr = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); audiomgr.setMode(AudioManager.STREAM_MUSIC); audiomgr.setSpeakerphoneOn(false);
- Actualizar Android ListActivity cuando cambia los datos de la lista?
- Gradle firma la aplicación con packageRelease "especificado para la propiedad 'signedConfig.storeFile' no existe"