抑制系统音量以播放应用内部的通知音频

时间:2014-10-09 09:42:54

标签: android android-mediaplayer

我的应用在后台作为服务运行,可以根据某些事件发出通知。目前,要播放通知文件,我在我的应用程序中使用MediaPlayer:

MediaPlayer mPlay = MediaPlayer.create(this, R.raw.sound);
mPlay.start();

但是,如果某首歌已在设备上播放(音乐播放器,收音机等),并且在收到该事件时播放了我的通知,则会同时听到两种声音(音乐音频和通知音频)。

那么,有没有办法可以抑制系统音量,以便清楚地听到通知,一旦通知音频结束,系统音频可以再次播放?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

我在以下链接中得到了这个问题的答案:

  

http://developer.android.com/training/managing-audio/audio-focus.html

我们需要请求音频焦点(瞬态/永久),然后才能播放应用音频:

AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
// Request audio focus for playback
int result = am.requestAudioFocus(afChangeListener,
                             // Use the music stream.
                             AudioManager.STREAM_MUSIC,
                             // Request permanent focus.
                             AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);

if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
    // Start playback.
    Log.i(TAG, "...audiofocus granted....");
    MediaPlayer mPlay = MediaPlayer.create(this, R.raw.sound);
    mPlay.start();
}

OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {
    public void onAudioFocusChange(int focusChange) {
        if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {
            // Pause playback
            Log.i(TAG, "....audiofocus loss transient in listener......");
        } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
            // Resume playback 
            Log.i(TAG, "....audiofocus gain in listener......");
        } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
            Log.i(TAG, "....audiofocus loss in listener......");
            //am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
            am.abandonAudioFocus(afChangeListener);
            // Stop playback
        }
    }
};

希望它有所帮助。