IjkPlayer+AndroidVideoCache 实现音乐播放

 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);
                }
            }
        }
   
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值