IjkPlayer 实现音乐播放(进度条、缓存、是否正在缓冲等)
枚举:
public enum AudioPlayEnum { /**播放空闲*/ PLAYER_FREE, /**预缓冲,准备播放中*/ PLAYER_PREPARING, /**播放中*/ PLAYER_PLAYING, /**播放完毕*/ PLAYER_COMPLETE, /**播放暂停*/ PLAYER_PAUSE, /**播放错误*/ PLAYER_ERROR }
回调接口
public interface AudioPlayerEvent { /** * 缓存更新 * */ void onBufferingUpdate(int percent); /** * 是否正在缓冲*/ void onBuffering(boolean isBuffering); /** * 播放进度*/ void onPlayProgress(long duration,long currPosition); /** * 播放状态改变 * @param mStatus 状态 */ void onStatusChange(AudioPlayEnum mStatus,int currPlayPotion); }
抽象类
public abstract class MyAbstractAudioPlayer { AudioPlayerEvent mAudioPlayerEvent; /** * 暂停之后调用,接着上一次播放 */ public abstract void reStart(); /** * 带资源播放,播放当前资源 * @param path path */ public abstract void start(String path); /** * 将整个列表添加到播放列表,如果是未播放状态,则播放第一个 * @param pathList 资源列表 */ public abstract void start(List<String> pathList); /** * 播放事件监听器 * @param event 时间 */ public abstract void setAudioPlayerListener(AudioPlayerEvent event); /** * 暂停 */ public abstract void pause(); /** * 暂停缓存 * @param path 路径 */ public abstract void stopCacheAndShutdown(String path); /** * 下一首 */ public abstract void nextPlay(); /** * 上一首 */ public abstract void prevPlay(); /** * 是否正在播放 * @return boolean */ public abstract boolean isPlaying(); /** * 当前播放状态 * @return AudioPlayEnum */ public abstract AudioPlayEnum getPlayerStatus(); /** * 调整进度 * @param time 时间 */ public abstract void seekTo(long time); /** * 拖动进度条,通知(防止拖动时Timmer跑进度条) */ public abstract void seekStart(); /** * 释放播放器 */ public abstract void release(); /** * 获取当前播放的位置 * @return 获取当前播放的位置 */ public abstract long getCurrentPosition(); /** * 获取视频总时长 * @return long */ public abstract long getDuration(); /** * 获取缓冲百分比 * @return int */ public abstract int getBufferedPercentage(); /** * 设置列表是否循环播放 * @param isLooping 循环 */ public abstract void setListLooping(boolean isLooping); /** * 设置是否单曲循环 * @param isLooping 循环 */ public abstract void setSingleLooping(boolean isLooping); }
该类实现对电话监听
/** * 自定义内部类对来电的电话状态进行监听 * @author chenpin */ public class MyPhoneStateListener extends PhoneStateListener { private MyAudioManager mMyAudioManager; /**记录来电时,是否在播放状态,在电话空闲时恢复*/ private boolean mAudioPlayingWhenCallRinging = false; MyPhoneStateListener(MyAudioManager mMyAudioManager) { this.mMyAudioManager = mMyAudioManager; } @Override public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); if (mMyAudioManager == null) { return; } switch (state) { case TelephonyManager.CALL_STATE_RINGING: case TelephonyManager.CALL_STATE_OFFHOOK: if(mMyAudioManager.isPlaying()){ mAudioPlayingWhenCallRinging = true; mMyAudioManager.pause(); }else{ mAudioPlayingWhenCallRinging = false; } break; case TelephonyManager.CALL_STATE_IDLE: //打完电话 mMyAudioManager.reStart(); break; default: break; } } }
封装AndroidVideoCache缓存类
/** * @author chenpin */ public class AudioCacheManager { /** * 最大缓存容量 */ private static final long DEFAULT_MAX_SIZE = 200 * 1024 * 1024; /** * 最大缓存数量 */ private static final int DEFAULT_MAX_FILE_COUNT = 20; /** * SD卡APP保存文件名 */ private static final String SD_SAVE_PATH = "appName"; @SuppressLint("SdCardPath") private static final String APP_SAVE_PATH = "/data/data/"; private static final String SAVE_AUDIO_PATH = "audio_cache"; private static AudioCacheManager mInstance; private static HttpProxyCacheServer mCacheServer; private CacheListener mCacheListener; public static AudioCacheManager getInstance(Context context) { Context applicationContext = context.getApplicationContext(); if (null == mInstance) { synchronized (AudioCacheManager.class) { if (null == mInstance) { mInstance = new AudioCacheManager(applicationContext); } } }