我想知道如何实现这种行为,以便在其他音频进入播放时我的广播流将停止播放 - 例如,用户开始播放音乐,拨打电话等。
换句话说,我的ExoPlayers如何知道正在播放其他音频,或者如果它没有,我是否必须听取媒体播放器和呼叫事件?
答案 0 :(得分:1)
以下是我为 音频状态管理器 制作的示例,您可以将其用作模板。 (2016年创建)
根据问题 - 您需要使用OnAudioFocusChangeListener
,请阅读示例中的注释:
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");
}
}
}
答案 1 :(得分:0)
您需要阅读Audio Focus。