11

スピーカーフォンを有効にするために、BroadcastReceiver (電話状態リスナー) で次のコードを使用しています。

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

これは、アプリを介して新しい発信通話が開始されたときに発生します。通話が切断されたら、スピーカーフォンをオフにします。

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

これはすべてうまくいくようです...初めてです。その後、私の電話のオーディオ ストリームがごちゃごちゃになっているようです。後続の呼び出しは奇妙に静かで、アプリのコードの外部からの呼び出しでも (上記の設定がトリガーされていない場合)。一見ランダムに通話音声を戻すことができますが、何が原因で戻ってくるのかわかりません。

私が間違っている可能性があることについてのアイデアはありますか? 私が気付いていない Android のバグはありますか? 後続の通話で音声が無音にならないようにするにはどうすればよいですか?

編集: Galaxy S4 でテストしています。

4

2 に答える 2

2

私はこの問題を解決しました。私のオーディオを台無しにしていたコードは次の行だったようです:

audioManager.setMode(AudioManager.MODE_IN_CALL);

この方法を使用したのは、それなしではスピーカーフォンの設定を正常に行うことができなかったためです (別のスタック オーバーフローの回答でモードを設定する提案を見つけました... 機能しましたが、問題のある結果が得られました)。

私が本当にしなければならなかったのは、この行を削除して、ハンドラーの遅延を から500に増やすことだけでした2000

この回答で提案されているように、AudioManager への静的参照も維持しました。この特定のケースでは必要ないようですが、申し訳ありませんが安全です。

于 2014-10-21T15:46:44.490 に答える
1

最初に、 setModeのドキュメントから次のテキストをコピーします。

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

言い換えれば、システム上の 1 つのアプリケーションだけが、この種のメソッドをいじる必要があります。そうしないと、一貫性が保証されません。

次に、いくつかのオーディオ ストリームが低すぎる場合に備えて、さまざまなオーディオ ストリームをチェックします (STREAM_VOICE_CALL、STREAM_SYSTEM、STREAM_RING、STREAM_MUSIC、または STREAM_ALARM)。setStreamMutesetSpeakerphoneOn の代わりに使用してみてください。

アプリケーションが実際に置き換えられているかどうかを知ることは役に立ちますthe platform-wide management of audio settings or the main telephony application

于 2014-10-21T00:16:51.897 に答える