当另一个应用程序的音频进来时停止播放音频 [英] Stop audio playing when another app's audio comes in

查看:210
本文介绍了当另一个应用程序的音频进来时停止播放音频的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道如何实现该行为,以便在播放其他音频时广播流停止播放-例如,用户开始播放音乐,拨打电话等.

I would like to know how do I implement the behaviour, so that my radio streaming would stop playing if other audio would come in to play - for instance, user starts playing music, makes a call etc.

换句话说,我的ExoPlayers如何知道正在播放其他音频,或者如果没有,我是否必须收听媒体播放器和通话事件?

In other words, how does my ExoPlayers knows that other audio is being played, or if it doesn't, do I have to listen for mediaplayer and call events?

推荐答案

以下是我为 音频状态管理器 制作的示例,您可以将其用作模板. (创建于2016年)

Here is an example i made for an audio state manager, you can use it as a template. (created in 2016)

根据问题-您需要使用OnAudioFocusChangeListener,请阅读示例中的注释:

As per the question - You need to use an OnAudioFocusChangeListener, Read the comments in the example:

public class AudioStateManager {

 private Context mContext;

 private AudioStateListener mListener;

 private AudioManager mAudioManager;

 private AudioFocusChangeListener mAudioFocusChangeListener;

 private AudioBecomingNoisyReceiver mAudioBecomingNoisyReceiver;

 public interface AudioStateListener {

    void onAudioFocusRequested();

    void onAudioFocusGained();

    void onVolumeLoweringRequested();
 }

 public void AudioStateManager(Context context) {
    this.mContext = context;
    mAudioManager = (AudioManager) 
    context.getSystemService(Context.AUDIO_SERVICE);
    mAudioFocusChangeListener = new AudioFocusChangeListener();
    mAudioBecomingNoisyReceiver = new AudioBecomingNoisyReceiver();
 }

 public void registerListener(AudioStateListener listener) {
    this.mListener = listener;
 }

 /**
  * Call when about to play
  *
  * @return true if audio focus is granted.
  */
 public boolean requestAudioFocus() {
    int result = mAudioManager.requestAudioFocus(mAudioFocusChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
    return result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED;
 }

 /**
  * Call when no longer in app or no longer need audioFocus
  */
 public void abandonAudioFocus() {
    mAudioManager.abandonAudioFocus(mAudioFocusChangeListener);
 }

 /**
  * Call when playing media
  */
 public void registerNoiseReceiver() {
    IntentFilter filter = new 
    IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
    mContext.registerReceiver(mAudioBecomingNoisyReceiver, filter);
 }

 /**
  * Call when media is paused/stopped
  */
 public void unregisterNoiseReceiver() {
    mContext.unregisterReceiver(mAudioBecomingNoisyReceiver);
 }

 private class AudioFocusChangeListener
        implements OnAudioFocusChangeListener {

    @Override
    public void onAudioFocusChange(int focusChange) {
        switch (focusChange) {
            case AudioManager.AUDIOFOCUS_LOSS:
                // another app gained audio focus
                // STOP PLAYBACK
                dispatchAudioFocusRequested();
                break;
            case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                // another app want you to pause media
                // PAUSE
                dispatchAudioFocusRequested();
                break;
            case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                // LOWER VOLUME (but keep playing)
                dispatchVolumeLoweringRequested();
                break;
            case AudioManager.AUDIOFOCUS_GAIN:
                // START PLAYBACK
                dispatchAudioFocusGained();
                break;
        }
    }
 }

 private void dispatchAudioFocusRequested() {
    if (mListener != null)
        mListener.onAudioFocusRequested();
 }

 private void dispatchAudioFocusGained() {
    if (mListener != null)
        mListener.onAudioFocusGained();
 }

 private void dispatchVolumeLoweringRequested() {
    if (mListener != null)
        mListener.onVolumeLoweringRequested();
 }

 /**
  * Called when unplugging your headphones for example
  * Register when start playing music
  */
 private class AudioBecomingNoisyReceiver
        extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        //Pause the music
        Log.i("TAG", "Audio became noisy - Pause Music");
    }
 }
}

这篇关于当另一个应用程序的音频进来时停止播放音频的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆