2012-12-19 21 views
16

Mi piacerebbe riprodurre l'audio da un file nell'auricolare del telefono (o nell'auricolare collegato) utilizzando l'androide MediaPlayer. Ho provato a utilizzare l'HOT MODE_IN_CALL come suggerito in questa discussione - Android - Getting audio to play through earpiece ma ciò non ha aiutato. L'app dispone anche dell'autorizzazione android.permission.MODIFY_AUDIO_SETTINGS, ma qualsiasi chiamata a m_amAudioManager.setSpeakerphoneOn(false); viene ignorata.Android - Riproduzione audio dall'auricolare

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

Una chiamata al setMode(AudioManager.STREAM_VOICE_CALL); sul MediaPlayer non aiutano.

mediaPlayer.reset(); 
mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 
mediaPlayer.setDataSource(path); 
mediaPlayer.prepare(); 

Qualcosa è cambiato da Android 2.3 per rompere questo codice? Ho provato il codice su Android ICS senza successo. Qualcuno può indicarmi la giusta direzione? L'audio riproduce sempre dal microfono fino a quel momento.

+0

Si prega di controllare la mia risposta qui: http://stackoverflow.com/a/29881184/672773 Spero proprio aiuta :) – Machete

risposta

27

Si scopre che il modo corretto per farlo è attraverso il seguente codice.

gioco attraverso l'auricolare

mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 

gioco attraverso il microfono

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

che è. Qualsiasi altra soluzione (compresa quella pubblicata qui ->Android - Getting audio to play through earpiece) non funziona in modo coerente su tutti i dispositivi. Infatti, l'utilizzo di MODE_IN_CALL garantisce che l'audio riprodurrà mai su determinati dispositivi.

Nota: Avrete bisogno di ri-preparare il lettore multimediale di cambiare i flussi.

+0

Dovrò provarlo. Ho usato la soluzione del post a cui hai fatto riferimento per anni senza problemi reali. Ho avuto alcune lamentele a caso di strani cambiamenti all'audio in altre app, ma non potrebbero mai essere confermati. Lo verificherò, suona sicuramente come una soluzione migliore. Non mi è mai piaciuta la mia soluzione, anche se ha funzionato. – Piwaf

+0

In particolare, alcune versioni del firmware in esecuzione su Samsung Galaxy S2 e Micromax incontrano problemi con la soluzione nell'altro post. Se lo stai ancora utilizzando, ti suggerirei di passare a questo frammento di codice. Non mi ha deluso finora. –

+0

Appare con questo approccio è necessario ri-"preparare" il MedialPlayer quando si cambia modalità. Anche questa è la tua esperienza? – Piwaf

0

Che ne dite di questo allora:

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

Quindi utilizzare STREAM_VOICE_CALL per il vostro MediaPlayer.

Se la chiamata setForceUse ha esito positivo e l'audio di MediaPlayer continua a essere riprodotto nell'altoparlante, quindi direi che qualcosa è incasinato nell'implementazione di AudioPolicyManager sul telefono/tablet su cui si sta verificando questa funzione.

+0

Il telefono cellulare è in grado di giocare dal auricolare su altre applicazioni. Non riesco a farlo funzionare solo sulla mia app. –

+0

@Gaffi: Sembra che tu stia ricevendo errori in fase di compilazione piuttosto che errori di runtime. Forse non hai importato il pacchetto di riflessione? Se si utilizza Eclipse, dovrebbe offrire automaticamente suggerimenti su come risolvere tali problemi. – Michael

3

volevo solo aggiungere un esempio completo per la risposta di Deepak Bala. Funziona quando non si utilizza il metodo 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(); 
    } 
0

ho trovato avevo bisogno di impostare sia il mediaplayer e audio manager

private MediaPlayer mp = new MediaPlayer(); 
AudioManager mAudioManager = (AudioManager) v.getContext() 
           .getSystemService(Context.AUDIO_SERVICE); 
         mAudioManager.setSpeakerphoneOn(false); 
         mp.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 
0

This method sta lavorando bene per me.

È necessario impostare anche la modalità di gestione audio. e quindi utilizzando audiomgr.setSpeakerphoneOn (falso) api è possibile alternare.

AudioManager audiomgr = (AudioManager) 
    context.getSystemService(Context.AUDIO_SERVICE); 
audiomgr.setMode(AudioManager.STREAM_MUSIC); 
audiomgr.setSpeakerphoneOn(false); 
0

Il seguente codice funziona bene per me e ho testato in su più dispositivi:

1- istanze creando:

MediaPlayer mPlayer = MediaPlayer.create(MainActivity.this, R.raw.skype_call_dialing); 
AudioManager mAudioManager = ((AudioManager).getSystemService(Context.AUDIO_SERVICE)); 

2- se si desidera impostare il volume di max (opzionale)

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- impostare l'audio su giocare da auricolare:

mAudioManager.setSpeakerphoneOn(false); 

4- gioco:

mPlayer.setLooping(true); 
mPlayer.start(); 

Fatto !!!! Ma vi sono alcuni suggerimenti che condividerò con voi:

1- nel passaggio 2, se impostate Audiomanager.setMode() prima di AudioManager.setStreamVolume(), il volume non verrà impostato su max!

2- se si aggiunge mPlayer.prepare() prima di mPlayer.setLooping (true); porterebbe a crash !, non si dovrebbe usare mPlayer.prepare() mentre MPlayer è in fase di inizializzazione in questo modo:

MediaPlayer mPlayer = MediaPlayer.create(MainActivity.this, R.raw.skype_call_dialing); 

3- al punto 2, mAudioManager.setMode() ho usato AudioManager.STREAM_MUSIC, quando provo altre modalità, in molti casi non ero in grado di accendere e spegnere l'altoparlante!

Problemi correlati