2014-10-16 24 views
11

Sto utilizzando il seguente codice in un BroadcastReceiver (telefono ascoltatore Stato) per abilitare il vivavoce:Utilizzando AudioManager interferisce con la chiamata audio

final Handler mHandler = new Handler(); 
mHandler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); 
     audioManager.setMode(AudioManager.MODE_IN_CALL); 
     audioManager.setSpeakerphoneOn(true); 
    } 
}, 500); 

Questo accade quando viene iniziata una nuova chiamata in uscita tramite la mia app. Quando la chiamata viene scollegata, mi rivolgo viva voce fuori:

AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 
audioManager.setMode(AudioManager.MODE_NORMAL); 
audioManager.setSpeakerphoneOn(false); 

Tutto questo sembra funzionare bene ... la prima volta. In seguito, i flussi audio del mio telefono sembrano essere ingarbugliati. Le chiamate successive sono stranamente silenziose, anche le chiamate effettuate al di fuori del codice della mia app (in cui le impostazioni precedenti non vengono attivate). Posso richiamare l'audio della chiamata in modo apparentemente casuale, ma non sono sicuro di quale sia la causa del suo ritorno.

Qualche idea su cosa potrei fare male? C'è un bug di Android di cui non sono a conoscenza? Come posso evitare di mettere a tacere il mio audio per le chiamate successive?

MODIFICA: Sto testando su un Galaxy S4.

risposta

2

ho risolto questo problema. Sembra che il codice che è stato rovinato tutto il mio audio è stato questa linea:

audioManager.setMode(AudioManager.MODE_IN_CALL); 

avevo usato questo metodo perché non ho potuto ottenere l'impostazione vivavoce di impegnarsi con successo senza di esso (ho trovato un suggerimento per impostare la modalità di un'altra risposta Stack Overflow ... ha funzionato, ma ha avuto conseguenze problematiche).

Tutto quello che dovevo fare era rimuovere questa linea e aumentare il ritardo del gestore da 500 a 2000.

Ho anche mantenuto un riferimento statico al AudioManager come suggerito in this answer. Non sembra necessario in questo caso particolare, ma è meglio prevenire che curare.

1

Innanzitutto, voglio copiare questo testo dal documentation di setMode, giusto per essere sicuri che si stanno avendo in considerazione:

The audio mode encompasses audio routing AND the behavior of the telephony layer. 
Therefore this method should only be used by applications that replace the platform-wide 
management of audio settings or the main telephony application 

In altre parole, solo applicazione une sul sistema dovrebbe essere giocando con questo tipo di metodi. Se fatto diversamente, la coerenza non è garantita.

Quindi vorrei controllare i diversi flussi audio nel caso in cui alcuni di essi fossero troppo bassi (STREAM_VOICE_CALL, STREAM_SYSTEM, STREAM_RING, STREAM_MUSIC o STREAM_ALARM). E magari provare a usare setStreamMute invece di setSpeakerphoneOn.

Sarebbe utile sapere se l'applicazione è in realtà la sostituzione the platform-wide management of audio settings or the main telephony application

+0

Grazie per la risposta. Mentre ho risolto il mio problema, la tua risposta mi ha spronato nella giusta direzione. Buon lavoro. –