传送到github看源码
下载apk试用 密码:rukn


前言

  • 想在天朝听音乐还是有些难度的, 一般来说, 两三个app还是要的. 那何不尝试自己做个手机播放器, 听个爽呢?!今天就带大家先做个简单的带进度条可拖动的音乐播放器.
  • 添加了后台播放的功能, 很实用哦~

先看效果图

很尴尬的一点就是大家没法听到音乐, 就只能看看图片.

效果图

布局文件

布局文件

添加Service

我们需要先把Service添加进来, 再考虑使用MediaPlayer播放, 我们分步来说.

  • 首先要有一个自定义接口, 这个接口中的方法都是要在服务中实现的, 然后要到Activity中使用的.
public interface IService {//1. 定义接口IService, 添加调用函数, 调用MusicService中对应的函数public void callPlayMusic(String path);public void callPauseMusic();public void callConMusic();public void callSeekToPos(int pos);
}
  • 然后来看Service中的实现, 自定义一个类, 继承Binder, 然后实现我们再接口中定义的方法.
    /*** 类MyBinder继承Binder实现接口IService*/private class MyBinder extends Binder implements IService {//2. 定义类MyBinder继承Binder实现接口IService中的函数@Overridepublic void callPlayMusic(String path) {playMusic(path);}@Overridepublic void callPauseMusic() {pauseMusic();}@Overridepublic void callConMusic() {conMusic();}@Overridepublic void callSeekToPos(int pos) {seekToPos(pos);}}
  • 具体的实现就要涉及到MediaPlayer的使用了, 我们等下说, 先把Service绑定到Activity. 首先要返回一个自定义类的实例.
    @Nullable@Overridepublic IBinder onBind(Intent intent) {//3. 返回自定义类MyBinder对象return new MyBinder();}
  • 然后我们转到Activity来绑定服务
    //4. 开启服务Intent intent = new Intent(this, MusicService.class);startService(intent);//7. 绑定服务MyConn myConn = new MyConn();bindService(intent, myConn, BIND_AUTO_CREATE);
  • 中间的MyConn又是一个自定义的类, 我们来看下实现. 之中要获取下IService对象, 以此调用定义的函数.
    private class MyConn implements ServiceConnection {//5. 定义类MyConn实现接口ServiceConnection@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {//6. 获取IBinder对象, 以此调用暴露的函数iService = (IService) service;}@Overridepublic void onServiceDisconnected(ComponentName name) {}}

MediaPlayer的使用

然后服务就完成一个绑定了, 之后我们来说下MediaPlayer和SeekBar的使用. 无非就是播放, 暂停, 继续这些的实现. 具体的说明请移步官方文档

    /*** 播放音乐** @param path 播放文件的路径*/public void playMusic(String path) {Log.i(TAG, "playMusic");try {mediaPlayer.reset();mediaPlayer.setDataSource(path);mediaPlayer.setLooping(true);mediaPlayer.prepare();mediaPlayer.start();updateSeekBar();} catch (Exception e) {e.printStackTrace();}}/*** 暂停播放音乐*/public void pauseMusic() {Log.i(TAG, "pauseMusic");if (mediaPlayer.isPlaying()) {mediaPlayer.pause();}}/*** 继续播放音乐*/public void conMusic() {Log.i(TAG, "conMusic");mediaPlayer.start();}

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


进度条的设置

SeekBar这里用起来其实不难, 难就难在要从Service传数据到Activity. 这里我选用Handler, 当然你也可以用其它办法. 同样我们分步来说.

  • 之前调用mediaPlayer.start();之后我调用了一个updateSeekBar();, 现在来看看实现. 关键是要获取到音乐的总长度, 并且实时更新, 要实时更新的话, 我这里开了一个线程, 1s刷一次, 就不多说了.
    /*** 更新SeekBar*/private void updateSeekBar() {//获取总时长final int duration = mediaPlayer.getDuration();//开启线程发送数据new Thread() {@Overridepublic void run() {while (keepTrue) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}int currentPosition = mediaPlayer.getCurrentPosition();//发送数据给activityMessage message = Message.obtain();Bundle bundle = new Bundle();bundle.putInt("duration", duration);bundle.putInt("currentPosition", currentPosition);message.setData(bundle);MainActivity.handler.sendMessage(message);}}}.start();}
  • 然后回到Activity要接收发送的message. 接收到之后也完成的差不多了. 然后就是一个SeekBar的监听设置.
    public static Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {Bundle data = msg.getData();int duration = data.getInt("duration");int currentPosition = data.getInt("currentPosition");sb_progress.setMax(duration);sb_progress.setProgress(currentPosition);}};
  • 就是在放开拖动SeekBar的时候重新设置位置, 要注意的是, 函数seekToPos也是在Service中实现的.
    //8. 设置进度条拖动事件sb_progress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {iService.callSeekToPos(seekBar.getProgress());}});
    /*** 设置SeekBar位置** @param pos 当前位置*/public void seekToPos(int pos) {mediaPlayer.seekTo(pos);}

这样就完成啦! 喜欢就赶紧下载试试吧! 有意见或者建议也可以评论区哦.


传送到github看源码
下载apk试用 密码:rukn


用MediaPlayer做个带进度条可后台的音乐播放器相关推荐

  1. android mp3进度条和时间,AndroidStudio音乐播放器进度条和歌曲时间的操作

    1.首先,我们需要使用在activity_main布局中定义好一个SeekBar和两个ListView,SeekBar表示进度条,两个ListView分别用来表示当前的时间和歌曲的总时间. 2.在Mu ...

  2. [DIY]给孩子做个音乐盒(arduino制作LCD显示音乐播放器)

    一次带孩子去商场,他对一个用木盒做的,LCD显示的音乐盒非常感兴趣,玩了半天,于是便想给孩子做一个音乐盒. 完成效果图: 材料: Arduinouno USB供电音箱(或8欧姆喇叭,10欧姆电阻,10 ...

  3. android倒计时水平进度条,Android实战 - 音心播放器 (MusicActivity - 倒计时 ,进度条实现)...

    1.背景 还是音乐播放界面,实现倒计时和进度条功能,基本实现过程: 当打开MusicActivity 的时候,MusicService会发送广播给MusicActivity ,后开始当前播放的时间进度 ...

  4. 手把手教你做音乐播放器(一)功能规划

    前言 学习完"计算器" "视频播放器" "蓝牙聊天"以后,对安卓应用的开发我们基本上就入门70%了. 现在,我们将在之前学习的基础上,进一步 ...

  5. android 上传图片进度条,Android带进度条的文件上传示例(使用AsyncTask异步任务)...

    最近项目中要做一个带进度条的上传文件的功能,学习了AsyncTask,使用起来比较方便,将几个方法实现就行,另外做了一个很简单的demo,希望能对大家有帮助,在程序中设好文件路径和服务器IP即可. d ...

  6. javascript,H5,jQuery,css“实现音乐歌词解析,歌词同步滚动,进度条拖拽、进度条同步,音量控制,歌词同步高亮的功能齐全的简易音乐播放器

    用js和HTML实现一个带歌词同步,以及进度条拖拽,音量控制的简单音乐播放器. 这个音乐播放器,可以实现歌词的滚动,进度条拖拽,音乐播放进度,音量控制等功能.,资源全为网上资源,直接复制代码,便能看到 ...

  7. web app升级—带进度条的App自动更新

    带进度条的App自动更新,效果如下图所示:   技术:vue.vant-ui.5+ 封装独立组件AppProgress.vue: <template><div><van- ...

  8. android自定义带进度条的圆形图片

    前言:在项目听新闻的改版中需要实现环绕圆形新闻图片的进度条功能,作为技术预备工作我就去看了一些网上的相关的原理,做了一个自定义带进度条的圆形图片的demo,并将这个实现写成文章发布出来,谁需要了可以进 ...

  9. 带进度条的x5WebView

    我们在使用webview加载网页的时候都希望顶部都有个进度条显示加载进度,由于在Android 4.4以下版本的Webview使用的是WebKit内核,,而在Android 4.4及其以上版本使用的是 ...

最新文章

  1. 有哪些适合放在程序员办公桌上的高逼格物件?哈哈哈哈哈哈哈!
  2. vbs枚举磁盘访问磁盘信息
  3. 按任意的字段旋转的存储过程
  4. 二维数组删除_「leetcode」数组:总结篇!(一文搞懂数组题目)
  5. hexo博客出现“Cannot GET/xxxx”的错误
  6. 怎么做装修预算?装修预算需要注意的三大事项
  7. Dynamips使用说明
  8. python—单例模式与多例模式的区别与创建
  9. bgp 建立邻居发送的报文_HCIE笔记-------BGP邻居状态详解
  10. LeetCode--Restore IP Addresses
  11. 2021-09-24
  12. Horizon 桌面用户会话10h后超时断开
  13. D - Hangar Hurdles(kruskal重构树+树上倍增)
  14. 2019-06-12-pintos 实验1
  15. 小米手机5s获得root权限的经验
  16. 关于Burp Suite不能抓包的解决方法
  17. Win10 开始菜单丢失部分菜单项和部分应用快捷方式
  18. ArcGis安装失败提示“需要Microsoft .NET Framework 3.5 sp1或等效环境”的解决方法
  19. 修改git远程仓库地址
  20. 写给婆婆的话,太经典了

热门文章

  1. TMG2010 之创建访问规则
  2. 对高性能Web服务的研究笔记
  3. jsp mysql 换行_jsp 操作 mysql 数据库
  4. [置顶] 2014年八大最热门IT技能
  5. mac电脑sublime text3安装pretty json插件
  6. LeetCode之 insertion-sort-list insertion-sort-list
  7. Request.From,Request.QueryString转对象
  8. 第一阶段用户模板和场景
  9. JQ用变量关联input name
  10. Microsoft.Jet.OLEDB.4.0”提供程序不支持 ITransactionLocal 接口。本地事务不可用于当前提供程序...