在Android怎么快速完成简易的音乐播放器
发表于:2024-11-18 作者:千家信息网编辑
千家信息网最后更新 2024年11月18日,这篇文章将为大家详细讲解有关在Android怎么快速完成简易的音乐播放器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。实现过程导入项目所需的音乐文件、图标、背景等1
千家信息网最后更新 2024年11月18日在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安全错误
数据库的锁怎样保障安全
地产公司网络安全
广州电力应急网络技术开发商家
软件开发的可以做哪些副业
网络安全工程师的意义
奥的斯服务器上翻
负载均衡服务器
搜道网络技术有限公司
网络安全攻防演戏情况报告
阿里网络安全施燕捷
使用数据库为什么要关防火墙
江阴测试软件开发怎么样
实现 数据库 java
DHCP服务器
pc端软件开发的供应商
苹果音频服务器
网络安全法 国家网信部门
网络安全2022年度计划
怎么用c登录数据库
计算机网络技术实验总结万能
网络技术与新媒体就业方向
请检查数据库是否已经启动
数据库查询输入的名字的数据
互联网行业网络安全试点示范
vb连接数据库报错方法
数据库错误245
软件开发功能需求文档6
软件开发中年就业
迅雷美女数据库12p
网络技术服务 网络营销
网络安全的观后感300