2014-10-16 10 views
11

Używam następujący kod w BroadcastReceiver (telefon państwowej słuchacza), aby włączyć głośnik:Korzystanie Audiomanager zakłóca połączenia dźwięku

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

Dzieje się tak, gdy nowe połączenie wychodzące inicjowane jest przez mój aplikacji. Kiedy połączenie zostanie rozłączone, zwracam głośnomówiący off:

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

To wszystko wydaje się działać dobrze ... po raz pierwszy. Potem strumienie audio mojego telefonu wydają się zaplątane w bałagan. Kolejne połączenia są dziwnie ciche, nawet połączenia wykonywane poza kodem mojej aplikacji (tam, gdzie powyższe ustawienia nie są wyzwalane). Mogę odebrać dźwięk odsłuchowy pozornie losowo, ale nie jestem pewien, co powoduje jego powrót.

Wszelkie pomysły na temat tego, co mogę zrobić źle? Czy istnieje błąd Androida, którego nie znam? Jak mogę uniknąć wyciszania dźwięku dla kolejnych połączeń?

EDYTOWANIE: Testuję na Galaxy S4.

Odpowiedz

2

Mam rozwiązać ten problem. Wydaje się, że kod został przekręcane moje dźwięk był ten wiersz:

audioManager.setMode(AudioManager.MODE_IN_CALL); 

używałem tej metody, ponieważ nie mogłem dostać ustawienie głośnika skutecznie angażować się bez niego (znalazłem sugestię, aby ustawić tryb w kolejna odpowiedź Stack Overflow ... zadziałała, ale miała problematyczne konsekwencje).

Jedyne co musiałem zrobić, to usunąć tę linię i zwiększyć opóźnienie obsługi od 500 do 2000.

Mam również utrzymywane statyczne odwołanie do menedżera AudioManager, zgodnie z sugestią podaną w this answer. W tym konkretnym przypadku nie wydaje się to konieczne, ale jest lepiej zabezpieczone niż przykro.

1

Po pierwsze, będę skopiuj ten tekst z documentation z setMode, tak aby mieć pewność, że mają go pod uwagę:

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 

Innymi słowy, tylko une aplikacji w systemie powinny być bawiąc tego rodzaju metody. W przeciwnym razie nie można zagwarantować spójności.

Następnie sprawdziłbym twoje różne strumienie audio, na wypadek gdyby niektóre z nich były zbyt niskie (STREAM_VOICE_CALL, STREAM_SYSTEM, STREAM_RING, STREAM_MUSIC lub STREAM_ALARM). I może spróbuj użyć setStreamMute zamiast setSpeakerphoneOn.

Dobrze byłoby wiedzieć, czy aplikacja jest w rzeczywistości zastępującego the platform-wide management of audio settings or the main telephony application

+0

Dzięki za odpowiedź. Kiedy skończyłem rozwiązywać własne problemy, twoja odpowiedź zachęciła mnie we właściwym kierunku. Dobra robota. –

Powiązane problemy