文章目录

  • 1.布局设置
    • 总体展示
    • 图片按钮样式
    • 进度条样式
  • 2.MainActivity主界面代码
      • 动作定义
    • 自定义广播
    • 动态发送广播
    • 动作监听
  • 3.MusicService服务代码
    • 音乐准备
    • 循环绑定
    • 进度条
    • 逻辑控制
  • 结果演示
  • 5.全部代码

1.布局设置

总体展示

图片按钮样式

<LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="0.5"android:gravity="center"android:orientation="horizontal"android:weightSum="4"><ImageButtonandroid:id="@+id/previous"android:layout_width="0dp"android:layout_height="50dp"android:layout_weight="1"android:background="#FFFFFF"android:src="@drawable/previous" /><ImageButtonandroid:id="@+id/play"android:layout_width="0dp"android:layout_height="50dp"android:layout_weight="1"android:background="#FFFFFF"android:src="@drawable/play" /><ImageButtonandroid:id="@+id/stop"android:layout_width="0dp"android:layout_height="50dp"android:layout_weight="1"android:background="#FFFFFF"android:src="@drawable/stop" /><ImageButtonandroid:id="@+id/next"android:layout_width="0dp"android:layout_height="50dp"android:layout_weight="1"android:background="#FFFFFF"android:src="@drawable/next" /></LinearLayout>

进度条样式

<LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="0.1"android:orientation="horizontal"><TextViewandroid:id="@+id/currentTime"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="0.1"android:gravity="center"android:text="@string/beginTime"android:textSize="18sp" /><ProgressBarandroid:id="@+id/progressBar"style="@style/Widget.AppCompat.ProgressBar.Horizontal"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_weight="1.4"android:max="100" /><TextViewandroid:id="@+id/totalTime"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="0.1"android:gravity="center"android:text="@string/endTime"android:textSize="18sp" /></LinearLayout>

2.MainActivity主界面代码

动作定义

定义两个动作分别用于MainActivity和MusicService 的监听

static final String CTL_ACTION = "org.gssmhzf.action.CTL_ACTION";
static final String UPDATE_ACTION ="org.gssmhzf.action.UPDATE_ACTION";

自定义广播

自定义广播用于在service与activity中切换以及传输信号

public class ActivityReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {int update = intent.getIntExtra("update",-1);int current = intent.getIntExtra("current", -1);int now = intent.getIntExtra("currentTime",-1);int total = intent.getIntExtra("totalTime",-1);if (current >= 0){title.setText(titleStrs[current]);author.setText(authorStrs[current]);}if (total >= 0) {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss", Locale.CHINA);Date date = new Date(total);String formatTime = simpleDateFormat.format(date);totalTime.setText(formatTime);}if (now >= 0) {double process = ((double)now / total) * 100;SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss", Locale.CHINA);Date date = new Date(now);String formatTime = simpleDateFormat.format(date);progressBar.setProgress((int) process);currentTime.setText(formatTime);}switch (update){case 0x11:play.setImageResource(R.drawable.play);status = 0x11;break;case 0x12:play.setImageResource(R.drawable.pause);status = 0x12;break;case 0x13:play.setImageResource(R.drawable.play);status = 0x13;break;}}}

动态发送广播

activityReceiver = new ActivityReceiver();// 创建IntentFilterIntentFilter filter = new IntentFilter();// 指定BroadcastReceiver监听的Actionfilter.addAction(UPDATE_ACTION);// 注册BroadcastReceiverregisterReceiver(activityReceiver, filter);// 启动后台ServicestartService(new Intent(this, MusicService.class));

动作监听

对四个图片按钮的动作监听

 @Overridepublic void onClick(View source){// 创建IntentIntent intent = new Intent(CTL_ACTION);switch (source.getId()){// 按下播放/暂停按钮case R.id.play:intent.putExtra("control", 1);break;// 按下停止按钮case R.id.stop:intent.putExtra("control", 2);break;// 按下上一首case R.id.previous:intent.putExtra("control", 3);break;// 按下下一首case R.id.next:intent.putExtra("control", 4);break;}// 发送广播,将被Service组件中的BroadcastReceiver接收到sendBroadcast(intent);}

3.MusicService服务代码

音乐准备

获取文件附件,获得音乐名字信息等内容

private void prepareAndPlay(String music){try{// 打开指定音乐文件AssetFileDescriptor afd = am.openFd(music);mPlayer.reset();// 使用MediaPlayer加载指定的声音文件。mPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(), afd.getLength());// 准备声音mPlayer.prepare();// 播放mPlayer.start();}catch (IOException e){e.printStackTrace();}}

循环绑定

为音乐循环播放绑定监听器使得播放器在不操作情况下能循环播放

mPlayer = new MediaPlayer();// 为MediaPlayer播放完成事件绑定监听器mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {Log.d("MusicService", "歌曲播放完毕");current++;if (current >= 4){current = 0;}//发送广播通知Activity更改文本框Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);sendIntent.putExtra("current", current);// 发送广播,将被Activity组件中的BroadcastReceiver接收到sendBroadcast(sendIntent);// 准备并播放音乐prepareAndPlay(musics[current]);}});

进度条

采用线程方式实现,监测歌曲播放状态,然后给主线程发送广播通知其修改相关进度条显示,设置线程休眠时长,避免过于频繁地刷新界面造成程序卡顿

processThread = new Thread(() -> {while (true){// 如果是播放状态if (status == 0x12){try {// 休眠一秒Thread.sleep(1000);// 给主线程发送广播Intent sendIntent1 = new Intent(MainActivity.UPDATE_ACTION);// 当前进度sendIntent1.putExtra("currentTime", mPlayer.getCurrentPosition());// 总进度sendIntent1.putExtra("totalTime", mPlayer.getDuration());// 发送广播,将被Activity组件中的BroadcastReceiver接收到sendBroadcast(sendIntent1);} catch (InterruptedException e) {e.printStackTrace();}}}});processThread.start();

逻辑控制

对主活动发送过来的信息进行处理对逻辑控制
(status的数值表示当前的状态,0x11代表没有播放;0x12代表正在播放;0x13代表暂停)

int control = intent.getIntExtra("control", -1);switch (control){// 播放或暂停case 1:// 原来处于没有播放状态if (status == 0x11){// 准备并播放音乐prepareAndPlay(musics[current]);status = 0x12;}// 原来处于播放状态else if (status == 0x12){// 暂停mPlayer.pause();// 改变为暂停状态status = 0x13;}// 原来处于暂停状态else if (status == 0x13){// 播放mPlayer.start();// 改变状态status = 0x12;}break;//停止声音case 2:if (status == 0x12 || status == 0x13) {mPlayer.stop();status = 0x11;}break;//上一首case 3:// 如果原来正在播放或暂停if (status == 0x12 || status == 0x13) {mPlayer.stop();if (current - 1 < 0) {current = musics.length - 1;} else {current--;}prepareAndPlay(musics[current]);status = 0x12;}break;//下一首case 4:if (status == 0x12 || status == 0x13) {mPlayer.stop();if (current + 1 >= musics.length) {current = 0;} else {current++;}prepareAndPlay(musics[current]);status = 0x12;}break;

结果演示

5.全部代码

项目全部代码都在这啦
点击这里!

Andriod Studio实现简易音乐播放器相关推荐

  1. Android Studio简易音乐播放器设计作业

    Android Studio简易音乐播放器设计作业 实验成功展示 实验代码 MainActivity.java XML文件 class文件 利用BroadcastReceiver模拟音乐播放器,实现播 ...

  2. Andriod小项目——在线音乐播放器

    Andriod小项目--在线音乐播放器 转载请注明:http://blog.csdn.net/sunkes/article/details/51189189 Android在线音乐播放器 从大一开始就 ...

  3. 利用Broadcast及相关组件实现简易音乐播放器功能

    目录 前言 项目源码 准备工作 代码编写 页面布局 Service类的创建 主函数的编写 项目心得 前言 在Andriod Studio中使用Broadcast实现了简易音乐播放器的功能.可以进行播放 ...

  4. Android Studio如何实现音乐播放器

    Android Studio如何实现音乐播放器 今天跟着大佬的步骤实现了一个和老师讲的不一样的简易音乐播放器,超级赞!再完善和改一下主题适合用作自己的音乐播放器. 原贴: Android Studio ...

  5. JavaScript + Audio API自制简易音乐播放器(详细完整版、小白都能看懂)

    JavaScript + Audio API自制简易音乐播放器(详细完整版) ** 音乐播放器的功能清单如下: ** 1.点击暂停按钮,歌曲暂停 2.点击播放按钮,歌曲播放 3.单曲循环与取消单曲循环 ...

  6. html实现简易音乐播放器

    目标: 使用vue.js导包的形式做一个简单的音乐播放器,新手也很容易看懂. 内容: 1. 使用了flex实现响应式布局: 2. 使用min-width防止字体被压缩: 3. 使用computed计算 ...

  7. 单片机音乐播放器课程设计C语言,单片机课程设计简易音乐播放器

    单片机课程设计简易音乐播放器 论文题目:简易音乐播放器所属系部:电子工程系 指导教师: 学生姓名: 学 号: 专 业: 电子信息工程技术 题目: 简易音乐播放器任务与要求:本设计以 MCS-51 系列 ...

  8. 【毕业设计】28-基于单片机的音乐播放器简易音乐播放器设计(原理图+源代码+仿真工程+答辩PPT+答辩论文)

    typora-root-url: ./ [毕业设计]28-基于单片机的音乐播放器简易音乐播放器设计(原理图+源代码+仿真工程+答辩PPT+答辩论文) 文章目录 typora-root-url: ./ ...

  9. 【微信小程序】简易音乐播放器,进度条拖拉、音乐的播放与暂停

    小程序简易音乐播放器实现 粗糙的页面设计: wxml部分: <view class="test"><view class="img">& ...

最新文章

  1. spgridview的过滤功能回调时发生错误~
  2. Hive 热门数据分析面试题解析
  3. 自学编程的人,都是怎么找到自己的第一份工作的?
  4. BZOJ 1833: [ZJOI2010]count 数字计数
  5. 一个6年java程序员的工作感悟,写给还在迷茫的你
  6. 浙大版c语言程序设计第三版答案
  7. 树莓派的蓝牙通讯(bluez、gattlib)
  8. url怎么隐藏html后缀,去除url后缀(.html,.jsp等)的有效方法
  9. Kitkat中对class core, class main, class late_start的简单分析
  10. 11种QQ技术 ,让你成为QQ高手
  11. wxpython 下拉列表的实现
  12. Redis 如何做内存优化?
  13. 【OpenPrompt】源码学习笔记
  14. 大学生初涉职场十一大病毒
  15. 微信小程序拍照截取指定区域图片(话不多说,直接上代码)
  16. opencv学习(二十五)之开运算、闭运算、形态梯度、顶帽、黑帽
  17. 电脑桌面如何添加便签 桌面添加便签的方法是什么
  18. Word论文公式的两个格式问题
  19. Python Matplotlib 花式绘图和中文字符显示、散点图、设置网格和散点函数拟合
  20. Java中的类加载机制

热门文章

  1. 并查集算法总结专题训练
  2. atitit 交换机 汇聚上联 网络克隆和标准共享的原理与区别
  3. 2010年十大安全事件回顾
  4. Cherry-Pick、Squash Commits、Rebase使用
  5. cigarettes
  6. SHP转化成JSON
  7. 高考满分作文 - 风沙渡
  8. altera_reserved_tck的问题
  9. tck/tk脚本介绍
  10. java中的.builder()方法实现详解