Android Studio制作简易音乐盒,实现播放/暂停、停止、上一首、下一首功能

前段时间学习了服务组件及其应用、广播接收者组件与通知,于是学做了一个简易音乐盒,以实现播放/暂停、停止、上一首、下一首这些功能。(我用的Android Studio3.6)

项目效果图

编译制作过程

主要增加及改动了以下文件

首先是在AndroidManifest.xml里配置service。关于AndroidManifest.xml文件的作用(可参考)
导入歌曲和图片,一般是在res文件夹下创建raw文件夹存放歌曲,我放在assets文件夹里,所以最开始创建的raw文件夹没用到。关于assets和raw的区别(可参考)
如何创建assets文件夹(与raw的创建类似):

前端设计

拖控件进行布局,两个textview控件以显示歌曲信息,四个imagebutton控件以实现相应功能

功能实现

MainActivity文件

最外层MainActivity函数里定义我需要用到的变量和子类

   TextView title,author;    //获取界面中显示歌曲标题、作者文本框ImageButton play,stop,last,next;    //播放/暂停、停止、上一首、下一首按钮ActivityReceiver activityReceiver;     //定义子类public static final String CTL_ACTION="org.crazyit.action.CTL_ACTION";public static final String UPDATE_ACTION="org.crazyit.action.UPDATE_ACTION";//定义播放状态,0x11代表没有播放,0x12代表正在播放,0x13代表暂停播放int status=0x11;String[] titleStrs=new String[]{"zero","blackswan","ugh"};String[] authorStrs=new String[]{"BTS","BTS","BTS"};

onCreate函数,获取相应按钮以及添加监听器、注册receiver

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//获取程序界面中的两个按钮play=(ImageButton) this.findViewById(R.id.play);stop=(ImageButton) this.findViewById(R.id.stop);title=(TextView) findViewById(R.id.title);author=(TextView) findViewById(R.id.author);last=(ImageButton) this.findViewById(R.id.last);next=(ImageButton) this.findViewById(R.id.next);//为按钮的单击事件添加监听器play.setOnClickListener(this);stop.setOnClickListener(this);last.setOnClickListener(this);next.setOnClickListener(this);activityReceiver=new ActivityReceiver();//创建IntentFilterIntentFilter filter=new IntentFilter();//指定BroadcastReceiver监听Actionfilter.addAction(UPDATE_ACTION);//注册BroadcaastReceiverregisterReceiver(activityReceiver,filter);Intent intent=new Intent(this,MusicService.class);//启动后台servicestartService(intent);}

ActivityReceiver子类,负责监听从Service传回来的广播,用switch控制系统状态

    public class ActivityReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent){//获取Intent中的update消息,update代表播放状态int update = intent.getIntExtra("update",-1);   //获取current中的current消息,current代表正在播放的歌int current =intent.getIntExtra("current",-1);  if(current>=0){title.setText(titleStrs[current]);author.setText(authorStrs[current]);}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;}}}

onClick函数,用switch判断点击事件,向Service中的receiver发送广播

public void onClick(View source){//创建IntentIntent intent=new Intent("org.crazyit.action.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.last:intent.putExtra("control",3);break;//按下下一首按钮case R.id.next:intent.putExtra("control",4);break;}//发送广播,将被Service组件中的BroadcastReceiver接收到sendBroadcast(intent);}

MusicService文件

同样的,在最外层函数定义需要用到的变量和子类

    MyReceiver serviceReceiver;AssetManager am;String[] musics=new String[]{"zero.mp3","blackswan.mp3","ugh.mp3"};MediaPlayer mPlayer;//当前的状态,0x11代表没有播放,0x12代表正在播放,0x13代表暂停int status=0x11;//记录当前正在播放的音乐int current=0;

onCreate函数

@Override
public void onCreate(){super.onCreate();am=getAssets();//创建BroadcastReceiverserviceReceiver=new MyReceiver();//创建IntentFilterIntentFilter filter=new IntentFilter();filter.addAction(MainActivity.CTL_ACTION);//注册receiver收到CTL_ACTION信息registerReceiver(serviceReceiver,filter);//创建MediaPlayermPlayer=new MediaPlayer();//为MediaPlayer播放完成事件绑定监听器mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {current++;if (current>=3){current=0;}//发送广播通知Activity更改文本框Intent sendIntent=new Intent(MainActivity.UPDATE_ACTION);sendIntent.putExtra("current",current);//发送广播,将被Activity组件中的BroadcastReceiver接收到sendBroadcast(sendIntent);//准备并播放音乐prepareAndPlay(musics[current]);}});}

MyReceiver子类,接收MainActivity发来的信息

    public class MyReceiver extends BroadcastReceiver{@Overridepublic  void onReceive(final Context context,Intent intent){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:prepareAndPlay(musics[--current]);status=0x12;break;//播放下一首case 4:prepareAndPlay(musics[++current]);status=0x12;break;}//广播通知Activity更改图标、文本框Intent sendIntent=new Intent(MainActivity.UPDATE_ACTION);sendIntent.putExtra("update",status);sendIntent.putExtra("current",current);//发送广播,将被Activity组件中的BroadcastReceiver接收到sendBroadcast(sendIntent);}}

prepareAndPlay函数,准备并播放音乐

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();}}

另外我的as之前不小心更新成了3.6版本,有些内容放在之前的版本并不适用,但总体来说差别不大。
以上便是我学习并制作简易音乐盒的过程及代码。如果有哪里说错或写错的地方欢迎指正,感谢!

Android Studio制作简易音乐盒相关推荐

  1. Android Studio制作简易微信界面

    文章目录 制作要求 一.top,buttom页面制作 二.四个tab页面和activity_main页面制作 1.四个tab页面 2.activity_main页面 三 . 五个java文件 制作要求 ...

  2. Android studio制作计算器源代码

    版权声明:本文为博主原创文章,未经博主允许不得转载.https://mp.csdn.net/postedit/82623704 一.Android studio制作计算器源代码 这是我学Android ...

  3. android页面布局计算机,Android Studio制作简单计算器App

    Android Studio制作简单计算器App 计算机界面如图: 程序设计步骤: (1)在布局文件中声明编辑文件框EditText,按钮Button等组件. (2)在MainActivity中获取组 ...

  4. Android Studio制作.9图片,看这一篇就够了

    一..9.png图片概念 这是安卓开发里面的一种特殊的图片 这种格式的图片在android 环境下具有自适应调节大小的能力,不会失真 (1)允许开发人员定义可扩展区域,当需要延伸图片以填充比图片本身更 ...

  5. Android Studio 制作微信界面 上

    工程功能介绍 打开app,首先是个闪屏界面(常见于一般打开app时的小广告),设置时间为2s后进入登录界面.在登录界面中,中间可以输入密码,点击登录按钮进入微信的界面.   微信的界面由4个fragm ...

  6. 蓝牙聊天App设计1:Android Studio制作蓝牙聊天通讯软件(UI界面设计)

    前言:蓝牙聊天App设计全部有三篇文章(一.UI界面设计,二.蓝牙搜索配对连接实现,三.蓝牙连接聊天),这篇文章是一.UI界面设计 课程1:Android Studio小白安装教程,以及第一个Andr ...

  7. 蓝牙聊天App设计3:Android Studio制作蓝牙聊天通讯软件(完结,蓝牙连接聊天,结合生活情景进行蓝牙通信的通俗讲解,以及代码功能实现,内容详细,讲解通俗易懂)

    前言:蓝牙聊天App设计全部有三篇文章(一.UI界面设计,二.蓝牙搜索配对连接实现,三.蓝牙连接聊天),这篇文章是:三.蓝牙连接聊天. 课程1:Android Studio小白安装教程,以及第一个An ...

  8. Android Studio制作搜索栏

    Android Studio制作搜索栏 前言 一.何为自定义控件? 二.制作步骤 1.引入布局 2.布局解析 测试 前言 一.何为自定义控件? 系统自带的控件都是直接或间接继承自View的,View是 ...

  9. android studio线性布局做计算器,Android studio设计简易计算器

    本文实例为大家分享了Android studio设计简易计算器的具体代码,供大家参考,具体内容如下 效果显示: 第一步,简单的界面布局 xmlns:tools="http://schemas ...

  10. 物联网控制APP入门专题(四)---使用android studio制作一个控制页面的APP框架

    摘要:上篇文章讲了如何用阿里云IoT Studio快速制作一个网页版的手机端,以及通过第三方平台将这个网页打包成一个APK文件,使它可以安装到手机实现APP的功能.但是使用第三方平台做的APP是需要收 ...

最新文章

  1. CF429D Tricky Function(求解公式、经分析转为求平面最近点对、思维)
  2. 黑马vue---13、事件修饰符的介绍
  3. 计算机学院张旭豪,饿了么收购百度外卖,可以看出张旭豪硕士研究生是有多厉害!...
  4. layui 渲染select下拉选项 ,日期控件的用法
  5. 机器学习之特征工程-特征选择
  6. pycharm创建一个Hello
  7. 3个阶段 项目征名_3个月!签约亿元以上项目66个
  8. (转)awk实例练习(二)
  9. cartographer探秘第四章之代码解析(七)--- Cartographer_ros
  10. 题目243-交换输出
  11. 创建一个超链接,点击这个超链接,显示数据库中的数据信息:MVC模式查询
  12. t检验临界值表中的n是什么_t检验(t-test)临界值表
  13. ReadHub android版
  14. 微信二次开发-windows版微信Hook开发SDK之C#版
  15. 杀戮尖塔是用java_杀戮尖塔修改class文件图文教程
  16. 学习笔记 | Python编程从入门到实践 | 第二章变量和简单数据类型
  17. Android,linux常用资源下载链接
  18. CSS实现立体字的效果
  19. 点击按钮复制微信号/公众号,并打开微信APP搜索H5如何制作。
  20. Unity3D-游戏场景优化之遮挡剔除(Occlusion Culling)的使用

热门文章

  1. aec一pc_什么是AEC声学回声消除器?
  2. 网络工程师考试大纲的考试要求有哪些
  3. U-Mail反垃圾邮件网关-垃圾邮件的“克星”
  4. 设计一个python程序来计算显示通过如图2-7所示的管道_python程序设计习题与答案...
  5. USB2.0系列(锆石科技FPGA)
  6. 苹果回应巴西政府禁止销售不附赠充电器的iPhone;小米造车新进展;国内首家以数据服务为核心的央企数据中台上线 | EA周报...
  7. devicemapper介绍
  8. Lattice PCIe 学习 1
  9. 【智能车学习】FTM模块
  10. HarryPotter第二部—Nagini