Android - 当电话响铃时,将所有现有音频流静音或暂停

时间:2016-09-13 11:38:01

标签: android audio-streaming

我有一个使用音频流的Android应用程序。创建活动后,我设置了setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);。当手机响铃时,我想将所有已存在的流静音。为此,我尝试向TelephonyManager添加一个监听器,但我无法对任何流进行静音。以下是我的代码:

AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
switch (phoneCallState) {
    case TelephonyManager.CALL_STATE_IDLE:
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(5000);
                    am.setStreamVolume(AudioManager.STREAM_VOICE_CALL, AudioManager.ADJUST_UNMUTE, 0);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        break;
    case TelephonyManager.CALL_STATE_RINGING:
        audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL,  AudioManager.ADJUST_MUTE, 0);
        break;
    case TelephonyManager.CALL_STATE_OFFHOOK:
        audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, AudioManager.ADJUST_MUTE, 0);
        break;
    default:
        Log.i(TAG, "onCallStateChanged: UNKNOWN_STATE: " + phoneCallState);
        break;
} 

我想要有相同的行为,例如,当我听音乐和电话响铃时,媒体播放器暂停。我提到音频流是由外部库管理的,所以我无法访问它们。

1 个答案:

答案 0 :(得分:0)

这不是应该怎么做的。 您应该获得AudioManager

AudioManager = audioManager = (AudioManager) service.getSystemService(Context.AUDIO_SERVICE);

使用以下方式请求音频焦点:

android.media.AudioManager#requestAudioFocus

第一个参数是AudioManager.OnAudioFocusChangeListener。它有一种方法可以覆盖:

android.media.AudioManager.OnAudioFocusChangeListener#onAudioFocusChange

它的参数是focusChange,可以是以下值之一:

您感兴趣的是AUDIOFOCUS_LOSS。

如果来自图书馆的音频流不尊重失去焦点,那么它的设计很糟糕。