掌握ExoPlayer核心功能,实现高效音频播放管理。本文将详细介绍AudioPlayerManager工具类的完整实现过程,助您快速构建稳定播放功能。
ExoPlayer作为谷歌官方推荐的多媒体框架,支持变速播放等高级特性。通过添加以下依赖即可快速集成:
implementation 'com.google.android.exoplayer:exoplayer:2.17.1' //exo播放器
AudioPlayerManager封装了音频焦点管理、播放控制等核心功能,包含以下特性:
/**
* 音频播放
*/
public class AudioPlayerManager {
private static final String TAG = "AudioPlayerManager";
private static AudioPlayerManager instance;
private Context context;
private SimpleExoPlayer mediaPlayer;
private DataSource.Factory dataSourceFactory;
private AudioManager manager; private AudioPlayerManager(Context context) {
this.context = context;
createPlayer();
requestAudioFocus();
} public static AudioPlayerManager getInstance(Context context) {
synchronized (AudioPlayerManager.class) {
if (instance == null) {
instance = new AudioPlayerManager(context);
}
} return instance;
} public void requestAudioFocus() {
manager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
// manager.requestAudioFocus(afChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
} public ExoPlayer getMediaPlayer() {
return mediaPlayer;
} public void setAudioFile2(String filepath) {
try {
//这是一个代表将要被播放的媒体的MediaSource
MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(filepath));
mediaPlayer.prepare(mediaSource);
mediaPlayer.setPlayWhenReady(false);
} catch (Exception e) {
e.printStackTrace();
}
} AudioManager.OnAudioFocusChangeListener afChangeListener = new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
switch (focusChange){
case AudioManager.AUDIOFOCUS_LOSS:
//长时间丢失焦点,当其他应用申请的焦点为AUDIOFOCUS_GAIN时,
//会触发此回调事件,例如播放QQ音乐,网易云音乐等
//通常需要暂停音乐播放,若没有暂停播放就会出现和其他音乐同时输出声音
//释放焦点,该方法可根据需要来决定是否调用
//若焦点释放掉之后,将不会再自动获得
manager.abandonAudioFocus(afChangeListener);
PlayControlTools.setACTION_PAUSE(); //控制播放暂停
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
//短暂性丢失焦点,当其他应用申请AUDIOFOCUS_GAIN_TRANSIENT或AUDIOFOCUS_