android 使用mediaplayer播放网络音乐

关于mediaplayer 的介绍

MediaPlayer是Android自带的一个多媒体播放类,可以播放音视频流或者本地音视频文件。MediaPlayer方法的调用需要在一定的状态下,下图是一个MediaPlayer对象被支持的播放控制操作驱动的声明周期和状态。其中,椭圆代表MediaPlayer可能驻留的状态,弧线表示驱动MediaPlayer在各个状态之间迁移的播放控制操作。这里有两种类型的弧线。由单箭头开始的弧线代表同步方法调用,而以双箭头开头的弧线代表异步方法调用。图片介绍来源于官方文。
 

封装一个管理类,用于播放在线的音乐

由于播放在线音乐时可能会因为网络的原因,导致耗时比较大,这里使用了AndroidVideoCache这个库,来实现音频的缓存,下次再播放的时候就可以避免再次从网络获取。
AndroidVideoCache地址:https://github.com/danikula/AndroidVideoCache以下是封装的管理类的代码:
AudioManager.java

public class AudioManager implements MediaPlayer.OnPreparedListener,
MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener{

    private static AudioManager INSTANCE;

    private MediaPlayer mMediaPlayer;

    private Context mContext;

    /**
     * 是否正在准备
     */
    private boolean isPreparing = false;

    /**
     * 当前准备
     */
    private AudioBean preBean;

    private Handler mHandler;

    /**
     * 最后的一个操作,如果是prepareing的时候,所有操作都保存在这里
     */
    private AudioBean curBean;

    private AudioManager(Context context){
        this.mContext = context;
        initMediaPlayer();
        mHandler = new Handler(){
            @Override
            public void handleMessage(@NonNull Message msg) {
                preparing();
            }
        };
    }

    public static AudioManager getInstance(Context context){
        if (INSTANCE == null) {
            synchronized(AudioManager.class) {
                if (INSTANCE == null){
                    INSTANCE = new AudioManager(context);
                }
            }
        }
        return INSTANCE;
    }

    /**
     * 播放Assest目录下的音频
     * @param name
     */
    public void playAssertAudio(String name) {
        if(mMediaPlayer != null && mContext != null) {
            try {
                mMediaPlayer.reset();
                AssetFileDescriptor fd = mContext.getAssets().openFd(name);
                mMediaPlayer.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());
                mMediaPlayer.prepareAsync();
                mMediaPlayer.setOnPreparedListener(this);
                mMediaPlayer.setOnCompletionListener(this);

                mMediaPlayer.setOnErrorListener(this);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 停止播放
     */
    protected void stopAssertAudio() {
        if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
            mMediaPlayer.stop();
            Toast.makeText(mContext, "停止播放", Toast.LENGTH_SHORT).show();
        }
    }


    /**
     * 播放音频
     * @param url
     */
    public void playAudio(final String url) {
        if(isPreparing) {
            setCurdata(url, AudioBean.START, true);
            return ;
        }
        if(mMediaPlayer != null && mContext != null) {
            try {
                setPredata(url, AudioBean.START, true);

                mMediaPlayer.reset();
                HttpProxyCacheServer proxy = HttpProxyCacheUtil.getAudioProxy(mContext);
                mMediaPlayer.setDataSource(proxy.getProxyUrl(url));
                isPreparing = true;
                mMediaPlayer.prepareAsync();
                mMediaPlayer.setOnPreparedListener(this);
                mMediaPlayer.setOnCompletionListener(this);

                mMediaPlayer.setOnErrorListener(this);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 释放MediaPlayer
     */
    public void clear() {
        if (mMediaPlayer != null) {
            if(mMediaPlayer.isPlaying())
                mMediaPlayer.stop();
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
    }

    /**
     * 停止播放
     */
    public void stopAudio(String url) {
        if(isPreparing) { // 如果mediaplayer当前正在准备数据,则只保留数据
            setCurdata(url, AudioBean.STOP, true);
        } else {
            if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
                mMediaPlayer.stop();
            }
        }
    }

    /**
     * 准备播放
     */
    @Override
    public void onPrepared(MediaPlayer mp) {
        mHandler.sendEmptyMessageDelayed(1, 0); // 模拟mediaplayer准备数据中间时长,延时
    }

    private void preparing() {
        isPreparing = false;
        if(preBean != null && curBean != null && curBean.isNeed()) { // 需要处理
            // 判断url是否一样,
            if(preBean.getUrl().equals(curBean.getUrl())) { // 比如点击暂停,又点击开始
                if(curBean.getStatus() == AudioBean.START && curBean.isNeed()) { // 如果同一个url并且需要播放,就直接start,比如prepare的时候,点击了暂停,在点击开始,同一个音频
                    start();
                } else { // 同一个url,如果是停止,就直接不处理,后面把isNeed设置成false
                }
            } else { // 如果不同url,说明点击了另外的音频,
                if(curBean.getStatus() == AudioBean.START && curBean.isNeed()) { // 重新play新的url
                    playAudio(curBean.getUrl());
                } else { // 如果停止的话无需处理
                }
            }
            setCurdata("", AudioBean.STOP, false);
        } else { // 如果最后一次操作不需要处理,则走正常流程
            start();
        }
    }

    /**
     * 完成
     */
    @Override
    public void onCompletion(MediaPlayer mp) {
    }

    /**
     * 播放错误
     */
    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
        return false;
    }

    /**
     * init
     */
    private void initMediaPlayer() {
        if(mMediaPlayer != null) {
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
        mMediaPlayer = new MediaPlayer();
        mMediaPlayer.setAudioStreamType(android.media.AudioManager.STREAM_MUSIC);
    }

    /**
     * 开始播放
     */
    private void start() {
        if (mMediaPlayer != null)
            mMediaPlayer.start();
    }

    /**
     * 保存prepare前的操作
     */
    private void setPredata(String url, int status, boolean isNeed) {
        if(preBean == null) {
            preBean = new AudioBean();
        }
        if(preBean != null) {
            preBean.setUrl(url);
            preBean.setStatus(status);
            preBean.setNeed(isNeed);
        }
    }

    /**
     * 保存prepare中的操作
     */
    private void setCurdata(String url, int status, boolean isNeed) {
        if(curBean == null) {
            curBean = new AudioBean();
        }
        if(curBean != null) {
            curBean.setUrl(url);
            curBean.setStatus(status);
            curBean.setNeed(isNeed);
        }
    }


}

这个管理类实现了播放在线音频的功能,如果有什么问题,欢迎留言交流。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android Kotlin MediaPlayer 是应用程序开发时可以使用的多媒体播放器库。它提供了播放音频和视频文件的功能,可以在应用程序中实现音乐播放、视频播放等功能。使用MediaPlayer,我们可以加载本地文件或者通过网络流来播放音频和视频。 使用MediaPlayer,我们首先需要创建一个MediaPlayer对象,然后设置数据源,可以是本地文件路径或者网络地址。接着,我们可以调用prepare()方法或者prepareAsync()方法来准备MediaPlayer。在准备好之后,我们可以调用start()方法开始播放,调用pause()方法暂停播放,调用seekTo()方法跳转播放位置,调用release()方法释放MediaPlayer等。 MediaPlayer还提供了一些其他的功能,比如设置音量、设置循环播放、设置播放速度等。我们可以使用setVolume()方法设置音量大小,用setLooping()方法设置循环播放,用setPlaybackParams()方法设置播放速度等。 在使用MediaPlayer时,需要注意一些事项。首先,MediaPlayer是一个比较重量级的库,可能会占用较多的内存。其次,需要在使用MediaPlayer后及时释放资源,防止内存泄漏。另外,还需要在合适的时机处理MediaPlayer的各种状态回调,比如准备完成回调、播放完成回调等。 总的来说,Android Kotlin MediaPlayer 是一个强大的多媒体播放器库,可以帮助我们实现音频和视频播放功能。通过学习和使用MediaPlayer,我们可以为我们的应用程序添加丰富的媒体播放体验。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值