为了账号安全,请及时绑定邮箱和手机立即绑定

教你用MediaPlayer做个带进度条的音乐播放器

标签:
Android

效果图


布局文件

好像还有点小清新???

5b82b1fc00016bf907000594.jpg

布局文件


MediaPlayer的使用

/**
 * 初始化播放器MediaPlayer
 */private void initMediaPlayer() {    //1. 加载选中歌曲
    try {        //1.1 设置音频文件路径, 或者是资源uri
        if (mType == 1) {
            mediaPlayer.setDataSource(mFilePath);
        } else if (mType == 2) {
            Uri uri = Uri.parse("android.resource://com.so.mymusic/" + R.raw.one);
            mediaPlayer.setDataSource(this, uri);
        } else {            return;
        }    
        //1.2 设置为循环, MediaPlayer预加载
        mediaPlayer.setLooping(true);
        mediaPlayer.prepare();
    } catch (Exception e) {
        e.printStackTrace();
    }
}/**
 * @param v 使用资源文件中的音乐
 */public void addMusic(View v) {
    mRawMusic = "R.raw.one";
    et_input_path.setText(mRawMusic);    //2. 初始化播放器
    mType = 2;
    initMediaPlayer();
}

public void setDataSource(Context context, Uri uri);
public void setDataSource(String path);

你可以使用setDataSource来加载uri定位的文件, 也可以传入文件系统中的路径path来加载, 示例就是这么分的. 在这之后一定要记得调用prepare方法去预装文件.

/**
* @param v 播放按钮
*/public void playMusic(View v) {    //1. 获取文件的持续时间
    sb_progress.setMax(mediaPlayer.getDuration());    
    if (!mediaPlayer.isPlaying()) {
        mediaPlayer.start();
    }
}/**
* @param v 暂停按钮
*/public void pauseMusic(View v) {    if (mediaPlayer.isPlaying()) {
        mediaPlayer.pause();
    }
}/**
* @param v 停止按钮
*/public void stopMusic(View v) {    if (mediaPlayer.isPlaying()) {
        mediaPlayer.reset();
        initMediaPlayer();
    }
}

这是三个按钮对应的点击方法, 要记得在播放前获取音乐文件的总时长, 并设置给进度条.

读取文件系统肯定是要权限的, 可以查看我之前的文章一个Util带你获取Android6.0以上的读写sdcard权限


进度条的设置

/**
* 初始化进度条
*/private void initSeekBar() {    //1. 设置进度条监听
    isSeek = false;
    sb_progress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        }    
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            isSeek = true;
        }    
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            mediaPlayer.seekTo(seekBar.getProgress());
            isSeek = false;
        }
    });    
    //2. 开启线程同步进度条
    new Thread() {        @Override
        public void run() {            while (keepTrue) {                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }                if (!isSeek) {
                    sb_progress.setProgress(mediaPlayer.getCurrentPosition());
                }
            }
        }
    }.start();
}

setOnSeekBarChangeListener的监听器有三个方法要重写, 除了用isSeek记录状态之外, 停止触摸之后使用MediaPlayer的seekTo方法是重点. 然后就是进度条的绘制肯定是要开新线程的. 有一点就是, 在while循环中, 条件参数不要直接写true, 要设置变量, 否则会警告啥的.

原文链接:http://www.apkbus.com/blog-928212-76887.html

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消