Android开发在线音频播放器之章节一 AudioPlayerManager Android开发在线音频播放器之章节一 AudioPlayerManager使用Exo播放器可支持倍速条件implementation com.google.android.exoplayer:exoplayer:2.17.1 //exo播放器音频管理工具类包含音频焦点管理、播放暂停、请求音频焦点、设置播放文件、判断播放状态、设置播放监听等功能。/*** 音频播放*/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 {//这是一个代表将要被播放的媒体的MediaSourceMediaSource 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() {Overridepublic 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_GAIN_TRANSIENT_EXCLUSIVE时//会触发此回调事件例如播放短视频拨打电话等。//通常需要暂停音乐播放playOrPause(false);PlayControlTools.setACTION_PAUSE();break;case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:playOrPause(false);//短暂性丢失焦点并作降音处理PlayControlTools.setACTION_PAUSE();break;case AudioManager.AUDIOFOCUS_GAIN://当其他应用申请焦点之后又释放焦点会触发此回调//可重新播放音乐// if(ConstantFd.unit_List!null ConstantFd.unit_List.size() 0 ConstantFd.control_play){// PlayControlTools.setACTION_PLAY();// }break;}}};//开始播放public void start() {int result manager.requestAudioFocus(afChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);if (result AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {Log.d(TAG, 有音频焦点);mediaPlayer.setPlayWhenReady(true);}else {Log.d(TAG, 无音频焦点);// mediaPlayer.setPlayWhenReady(false);}}// public void setrepeat(boolean repeat){ //循环复读// //单次列表播放播放完了就停止//// Player.REPEAT_MODE_OFF;// //循环播放单个//// Player.REPEAT_MODE_ONE;// //列表循环//// Player.REPEAT_MODE_ALL;// if(repeat){// mediaPlayer.setRepeatMode(Player.REPEAT_MODE_ONE);// }else {// mediaPlayer.setRepeatMode(Player.REPEAT_MODE_OFF);// }//// }//判断是否是播放状态public boolean isPlaying() {int playbackState mediaPlayer.getPlaybackState();if (playbackState SimpleExoPlayer.STATE_READY mediaPlayer.getPlayWhenReady()) {return true;}return false;}//播放or暂停public void playOrPause(boolean isplay) {if(isplay){int result manager.requestAudioFocus(afChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);if (result AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {Log.d(TAG, 有音频焦点);}else {Log.d(TAG, 无音频焦点);}}mediaPlayer.setPlayWhenReady(isplay);}//切换播放速率public void switchSpeed(float speedIndex) {// API 23 6.0以上 通过设置Speed改变音乐的播放速率getMediaPlayer().setPlaybackParameters(new PlaybackParameters(speedIndex));if (isPlaying()) {// 判断是否正在播放未播放时要在设置Speed后暂停音乐播放} else {// getMediaPlayer().setPlayWhenReady(false);}}//停止播放public void stop(boolean reset) {if (mediaPlayer ! null) {mediaPlayer.stop(reset);manager.abandonAudioFocus(afChangeListener);}}//释放资源public void release() {if (mediaPlayer ! null) {mediaPlayer.release();instance null;}}//创建一个新的playerprivate void createPlayer() {//创建一个DataSource对象通过它来下载多媒体数据dataSourceFactory new DefaultDataSourceFactory(context, Util.getUserAgent(context, BuildConfig.APPLICATION_ID));mediaPlayer new SimpleExoPlayer.Builder(context).build();}public void setlistener(Player.Listener listener) {mediaPlayer.addListener(listener);}}在Service或Activity中使用private static AudioPlayerManager apm; //音频播放管理Overridepublic void onCreate() {super.onCreate();apm AudioPlayerManager.getInstance(TbjcPlayerService.this);//播放监听Player.Listener listener new Player.Listener() {Overridepublic void onPlayerStateChanged(boolean playWhenReady, int playbackState) {switch (playbackState) {case Player.STATE_BUFFERING://加载缓存且还未准备好时触发break;case Player.STATE_READY: //播放准备break;case Player.STATE_ENDED: //播放结束时触发Log.e(TAG, STATE_ENDED--- );break;}}};apm.setlistener(listener);apm.switchSpeed(1.0f);}Overridepublic void onDestroy() {super.onDestroy();if (apm ! null) {apm.setlistener(null); // 移除监听器切断引用链apm.release(); // 释放音频资源apm null; // 置空避免后续引用}}