2014-10-16 14 views
11

Ich verwende den folgenden Code in einem BroadcastReceiver (Telefonstatus Hörer) Freisprechfunktion zu aktivieren:Verwendung von Audio-Manager stört Anruf 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); 

Dies geschieht, wenn ein neuer abgehender Anruf über meine App gestartet wird. Wenn der Anruf getrennt wird, schalte ich die Freisprecheinrichtung aus:

Das scheint alles gut zu funktionieren ... das erste Mal. Danach scheinen die Audiostreams meines Telefons in ein Durcheinander verwickelt zu sein. Nachfolgende Aufrufe sind seltsam leise, sogar Anrufe, die außerhalb des Codes meiner App getätigt werden (wobei die obigen Einstellungen nicht ausgelöst werden). Ich kann Audio scheinbar wahllos zurückrufen, aber ich bin mir nicht sicher, was es zurückbringt.

Irgendwelche Ideen, was ich falsch machen könnte? Gibt es einen Android-Fehler, den ich nicht kenne? Wie kann ich verhindern, dass mein Audio für nachfolgende Anrufe stummgeschaltet wird?

EDIT: Ich teste auf einem Galaxy S4.

Antwort

2

ersetzt ich dieses Problem gelöst haben. Es scheint, der Code, der mein Audio diese Linie war, kneift:

audioManager.setMode(AudioManager.MODE_IN_CALL); 

ich diese Methode benutzt hatte, weil ich nicht die Freisprecheinrichtung Einstellung erfolgreich, ohne es zu engagieren bekommen konnte (fand ich einen Vorschlag, den Modus zu setzen in eine andere Stack Overflow Antwort ... es funktionierte, hatte aber problematische Folgen).

Alles, was ich wirklich tun musste, war diese Zeile zu entfernen und die Handler-Verzögerung von 500 auf 2000 zu erhöhen.

Ich habe auch einen statischen Verweis auf den AudioManager beibehalten, wie in this answer vorgeschlagen. Es scheint in diesem speziellen Fall nicht notwendig zu sein, aber besser als Nachsicht.

1

Zunächst werde ich diesen Text aus den documentation von setMode kopieren, nur um sicherzustellen, dass Sie es zu berücksichtigen haben:

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 

Mit anderen Worten, nur une Anwendung auf dem System liebäugelt sollte mit diese Art von Methoden. Wenn es anders geht, ist die Konsistenz nicht gewährleistet.

Dann würde ich Ihren verschiedenen Audio-Streams in Fall überprüfen Sie einige von ihnen zu niedrig (STREAM_VOICE_CALL, STREAM_SYSTEM, STREAM_RING, STREAM_MUSIC oder STREAM_ALARM). Und vielleicht versuchen Sie setStreamMute anstelle von setSpeakerphoneOn zu verwenden.

Es wäre hilfreich, zu wissen, ob Ihre Anwendung ist in der Tat the platform-wide management of audio settings or the main telephony application

+0

Danke für Ihre Antwort. Während ich letztendlich mein eigenes Problem gelöst habe, hat mich deine Antwort in die richtige Richtung gelenkt. Gut gemacht. –

Verwandte Themen