前言
焦点管理是Android中比较重要的一个点,这也是Android对播放器的一个约束条件,但手机上的播放器应用都不太准守这个准则,所以就就可以存在混音问题。
这里记录一下我自己的理解,当然,由于文笔过于拙,内容不会分享,谢谢。
正文
代码片段
AudioFocusManager.java
public class AudioFocusManager {
private final String TAG = FileApp.TAG + getClass().getSimpleName();
private AudioFocusRequest mAudioFocusRequest = null;
private AudioManager mAudioManager;
public AudioFocusManager() {
mAudioManager = (AudioManager) FileApp.getContext().getSystemService(Context.AUDIO_SERVICE);
}
public void release() {
mAudioManager = null;
}
/**
* @param listener 设置焦点状态监听
* @param usage 设置场景(Build.VERSION_CODES.O后支持)
* @param streamType 设置的流媒体类型
* @param durationHint 设置的焦点状态类型
* @param acceptDelay 设置接受延迟(Build.VERSION_CODES.O后支持)
*/
public int requestAudioFocus(AudioManager.OnAudioFocusChangeListener listener, int usage, int streamType, int durationHint, boolean acceptDelay) {
if (null == mAudioManager || null == listener) {
Log.d(TAG, "requestAudioFocus null... ");
return -1;
}
mAudioFocusRequest = new AudioFocusRequest.Builder(durationHint)
.setAudioAttributes(new AudioAttributes.Builder().setUsage(usage).setContentType(streamType).build())
.setAcceptsDelayedFocusGain(acceptDelay)
.setOnAudioFocusChangeListener(listener).build();
return mAudioManager.requestAudioFocus(mAudioFocusRequest);
}
/**
* 释放焦点
*
* @param listener 焦点状态监听
*/
public void abandonAudioFocusRequest(AudioManager.OnAudioFocusChangeListener listener) {
if (null == mAudioManager || null == listener) {
Log.d(TAG, "abandonAudioFocusRequest null... ");
return;
}
mAudioManager.abandonAudioFocusRequest(mAudioFocusRequest);
}
}
如何使用:
if (null != mAudioFocusManager) {
int status = mAudioFocusManager.requestAudioFocus(this, AudioAttributes.USAGE_MEDIA,
AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN, true);
Log.d(TAG, "registerSource status : " + status);
}
焦点申请
参考文章
© 版权声明