在Android怎么快速完成简易的音乐播放器
发表于:2025-11-16 作者:千家信息网编辑
千家信息网最后更新 2025年11月16日,这篇文章将为大家详细讲解有关在Android怎么快速完成简易的音乐播放器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。实现过程导入项目所需的音乐文件、图标、背景等1
千家信息网最后更新 2025年11月16日在Android怎么快速完成简易的音乐播放器
这篇文章将为大家详细讲解有关在Android怎么快速完成简易的音乐播放器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
实现过程
导入项目所需的音乐文件、图标、背景等
1.创建一个raw文件夹,将音乐文件导入到这个文件夹中,方便我们在项目中使用
2.在drawable中导入所需的图片、图标
设计UI界面
1.设计5个button控件,分别对应上一曲,下一曲,暂停,播放,退出
2.设计3个TextView,分别对应歌曲的介绍信息、歌曲的进度(歌曲的总时间和歌曲当前播放的时间)、歌曲的名字
service服务的编写
创建一个MusicService对象继承Service
MusicService所需要的成员变量
MyReceiver serviceReceiver;Thread processThread;AssetManager am;//是附件管理器,用于根据文件名找到文件所在并打开文件String[] musics = new String[]{"legendsneverdie.mp3", "promise.mp3", "beautiful.mp3"};//默认显示的歌曲信息MediaPlayer mPlayer;// 当前的状态,0x11代表没有播放;0x12代表正在播放;0x13代表暂停int status = 0x11;// 记录当前正在播放的音乐int current = 0;实现循环播放
public void onCreate() { super.onCreate(); am = getAssets(); // 创建BroadcastReceiver serviceReceiver = new MyReceiver(); // 创建IntentFilter IntentFilter filter = new IntentFilter(); filter.addAction(MainActivity.CTL_ACTION); registerReceiver(serviceReceiver, filter); // 创建MediaPlayer mPlayer = new MediaPlayer(); // 为MediaPlayer播放完成事件绑定监听器 mPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { Log.d("musicService", "播放完成"); current++; if (current >= 3) { current = 0; } // 准备并播放音乐 prepareAndPlay(musics[current]); //发送广播通知Activity更改文本框 Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION); sendIntent.putExtra("current", current); sendIntent.putExtra("currentTime", mPlayer.getCurrentPosition()); sendIntent.putExtra("totalTime", mPlayer.getDuration()); // 发送广播,将被Activity组件中的BroadcastReceiver接收到 sendBroadcast(sendIntent); } }); 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(); } }实现刷新进度条
processThread = new Thread(new Runnable() { @Override public void run() { while (true) { if (status == 0x12) { try { Thread.sleep(1000); Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION); sendIntent.putExtra("current", current); sendIntent.putExtra("currentTime", mPlayer.getCurrentPosition()); sendIntent.putExtra("totalTime", mPlayer.getDuration()); // 发送广播,将被Activity组件中的BroadcastReceiver接收到 sendBroadcast(sendIntent); } catch (InterruptedException e) { e.printStackTrace(); } } } } }); processThread.start();}广播通信接收器的实现(用于实现和activity的通信)
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context, Intent intent) { int control = intent.getIntExtra("control", -1); Log.d("musicReceiver", "收到广播, control=" + control); 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(); if (current + 1 >= musics.length) { current = 0; } else { current++; } prepareAndPlay(musics[current]); status = 0x12; 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; } } // 广播通知Activity更改图标、文本框 Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION); sendIntent.putExtra("update", status); sendIntent.putExtra("current", current); // 发送广播,将被Activity组件中的BroadcastReceiver接收到 sendBroadcast(sendIntent); }}activity的实现
初始化和动态绑定接收器
// 获取界面中显示歌曲标题、作者文本框TextView title, author, currentTime, totalTime;// 播放/暂停、停止按钮ImageButton play;ImageView lastMusic, nextMusic;// 进度条ProgressBar progressBar;ActivityReceiver activityReceiver;public static final String CTL_ACTION = "org.xr.action.CTL_ACTION";public static final String UPDATE_ACTION = "org.xr.action.UPDATE_ACTION";// 定义音乐的播放状态,0x11代表没有播放;0x12代表正在播放;0x13代表暂停int status = 0x11;String[] titleStrs = new String[]{"Legends Never Die", "约定", "美丽新世界"};String[] authorStrs = new String[]{"英雄联盟", "周蕙", "伍佰"};@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 获取程序界面界面中的两个按钮 play = (ImageButton) this.findViewById(R.id.play); lastMusic = this.findViewById(R.id.lastMusic); nextMusic = this.findViewById(R.id.nextMusic); title = (TextView) findViewById(R.id.title); author = (TextView) findViewById(R.id.author); currentTime = findViewById(R.id.currentTime); totalTime = findViewById(R.id.totalTime); progressBar = findViewById(R.id.progressBar); // 为两个按钮的单击事件添加监听器 play.setOnClickListener(this); lastMusic.setOnClickListener(this); nextMusic.setOnClickListener(this); activityReceiver = new ActivityReceiver(); // 创建IntentFilter IntentFilter filter = new IntentFilter(); // 指定BroadcastReceiver监听的Action filter.addAction(UPDATE_ACTION); // 注册BroadcastReceiver registerReceiver(activityReceiver, filter); Intent intent = new Intent(this, MusicService.class); // 启动后台Service startService(intent);}设置activity的广播接收器(接收service发送过来的广播)
public void onReceive(Context context, Intent intent) { // 获取Intent中的update消息,update代表播放状态 int update = intent.getIntExtra("update", -1); // 获取Intent中的current消息,current代表当前正在播放的歌曲 int current = intent.getIntExtra("current", -1); int totalPosition = intent.getIntExtra("totalTime", -1); int currentPosition = intent.getIntExtra("currentTime", -1); Log.d("activityReceiver", "收到广播"); Log.d("activityReceiver", "current:" + current + " totalPosition:" + totalPosition + " currentPosition:" + currentPosition + " update:" + update); if (current >= 0) { title.setText(titleStrs[current]); author.setText(authorStrs[current]); } if (totalPosition >= 0) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss", Locale.CHINA); Date date = new Date(totalPosition); String formatTime = simpleDateFormat.format(date); totalTime.setText(formatTime); } if (currentPosition >= 0) { double process = ((double)currentPosition / totalPosition)*100; Log.d("activityReceiver", "当前进度:" + (double)currentPosition/totalPosition); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss", Locale.CHINA); Date date = new Date(currentPosition); 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; }}实现图标的点击功能
// 创建Intent Intent intent = new Intent("org.xr.action.CTL_ACTION"); switch (source.getId()) { // 按下播放/暂停按钮 case R.id.play: intent.putExtra("control", 1); break; case R.id.lastMusic: intent.putExtra("control", 3); case R.id.nextMusic: intent.putExtra("control", 2); } // 发送广播,将被Service组件中的BroadcastReceiver接收到 sendBroadcast(intent);}关于"在Android怎么快速完成简易的音乐播放器"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
状态
广播
音乐
文件
代表
歌曲
图标
按钮
正在
界面
组件
进度
接收器
文本
篇文章
准备
监听
设计
播放器
简易
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
信息技术数据库数值类型
基因库数据库
网络安全三性cia
电脑网络安全证书过期怎么办
绥中软件开发文档
家庭教育和网络安全直播
多表查询数据库题库
网络安全周活动工作会议讲话
想让代码在服务器上怎么做
密钥管理服务器搭建
服务器液冷龙头企业
海康服务器系统安装2016步骤
php软件开发工程师职责
美国服务器免费试用
传奇架设新建数据库名称
云南移动服务器主机名
好的软件开发者
华为云核心的通用软件开发
网络安全与生活的关系
维护网络安全防范电信诈骗手抄报
泰安分销软件开发哪家靠谱
烟囱设计软件开发
postfix服务器
属于数据库管理系统软件的
电气转行数据库工程师
多表查询数据库题库
宁夏网络安全建设
高邑软件开发
想让代码在服务器上怎么做
计算机网络技术找什么工作简单