Android开发---音乐播放器(服务类的实现)
来源:互联网 发布:百度助手 网络不可用 编辑:程序博客网 时间:2024/05/22 04:36
上一篇文章中我们讲解了如何将本地音乐扫描到ListView中,在此补充几点:
1.存放歌曲信息的Model类,为了方便管理,我新建了一个包去存放这个类;
2.扫描音乐是依靠音乐的路径扫描得到的,但在显示的时候可以选择显示/不显示歌曲路径(一般我们是选择隐藏歌曲路径的,毕竟那么一大堆文件后缀、、、)
OK~~~进入正题啦
一般的手机软件都支持后台运行,想象一下,没有哪款音乐播放器需要一直停留在播放界面才可以一直播放音乐,退出了就自动停止播放。所以,在此我们需要接触到Android的四大组件(Activity、Server、Content Provider、Broadcast Receiver)外加Intent组件
具体的流程为:
1.新建一个My Server的服务类
2.在Manifest中注册(这步骤非常关键~~~)
3.创建一个新活动
4.发送广播
具体代码:
package com.lmy.lesson_10;import java.io.FileNotFoundException;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.util.ArrayList;import android.app.Service;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.media.MediaPlayer;import android.media.MediaPlayer.OnCompletionListener;import android.os.Handler;import android.os.IBinder;import android.widget.Toast;import lmyPackage.LrcModel;import lmyPackage.Model;public class MySeriver extends Service {// Model动态数组,存储歌曲信息ArrayList<Model> alist;// 歌词信息ArrayList<LrcModel> lrcList;// 扫描类ScanMusic scanmusic;// 系统多媒体类MediaPlayer media;// 歌曲路径String path;// 歌曲播放數量int num;// 歌曲时间线程,分担主线程的耗时动作Handler handler;// 歌词线程Handler lrchandler;// 广播MyBroadCast mybroadcast;int playmention = 0;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();// 实例化扫描类的对象scanmusic = new ScanMusic();// 动态数组对象alist = new ArrayList<Model>();// 扫描alist = scanmusic.query(alist, this);// 歌词对象lrcList = new ArrayList<LrcModel>();// 广播mybroadcast = new MyBroadCast();// 多媒体对象media = new MediaPlayer();// 歌曲时间线程handler = new Handler();// 歌词线程lrchandler = new Handler();// 注册广播registerBoradcastReceiver();}// 广播接收者public void registerBoradcastReceiver() {// 属性交互IntentFilter intentfilter = new IntentFilter();// 获得歌曲路径intentfilter.addAction("ACTION_INDEX");// 播放/暂停intentfilter.addAction("ACTION_ISPLAY");// 下一曲intentfilter.addAction("ACTION_NEXT");// 重复播放intentfilter.addAction("ACTION_MENTION");//进度条拖动intentfilter.addAction("ACTION_SEEKBAR_DRANG");registerReceiver(mybroadcast, intentfilter);}public void SetData(String path) {// 媒体准备media.reset();try {// 得到路径media.setDataSource(path);media.prepare();// 获得歌曲总时间Alltime();} catch (FileNotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}media.start();//获得歌曲路径lrcList = scanmusic.redLrc(path);// 线程handler.postDelayed(mrunable, 1000);lrchandler.postDelayed(lrcRunnable, 1000);}public int getRandomIndex(int i) {// TODO Auto-generated method stubint index = (int) (Math.random() * alist.size());return index;}public class MyBroadCast extends BroadcastReceiver {//接受广播@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubif (intent.getAction().equals("ACTION_INDEX")) {num = intent.getIntExtra("index", 0); //获得当前列表的下标值path = alist.get(num).getPath();//根据下标值播放歌曲SetData(path);//播放、暂停} else if (intent.getAction().equals("ACTION_ISPLAY")) {boolean isplay = intent.getBooleanExtra("isplay", false);if (isplay == true) {media.start();} else {media.pause();}} //下一曲、上一曲else if (intent.getAction().equals("ACTION_NEXT")) {int next_num = intent.getIntExtra("next", 0);if (next_num == 0) {up();} else if (next_num == 1) {down();}} //进度条事件else if(intent.getAction().equals("ACTION_SEEKBAR_DRANG")){int progress = intent.getIntExtra("progress", 0);media.seekTo(progress);}//播放选择else if (intent.getAction().equals("ACTION_MENTION")) {playmention = intent.getIntExtra("mention", 0);Playmetion(playmention);}}}// 上一曲public void up() {num--;if (num < 0) {num = alist.size() - 1;}String path = alist.get(num).getPath();SetData(path);}// 下一曲public void down() {num++;if (num > alist.size() - 1) {num = 0;}String path = alist.get(num).getPath();SetData(path);}//选择顺序播放、单曲循环、随机播放public void Playmetion(final int status){media.setOnCompletionListener(new OnCompletionListener() {String path = null;@Overridepublic void onCompletion(MediaPlayer mp) {// TODO Auto-generated method stubif(status == 1){if(num ==alist.size()-1){num=0;}else{num++;} path = alist.get(num).getPath();SetData(path);}else if(status == 2){ path = alist.get(num).getPath();SetData(path);}else if(status == 3){ num = getRandomIndex(alist.size() - 1); num++; path = alist.get(num).getPath();SetData(path);}}});}// 歌曲总时间public void Alltime() {Intent intent = new Intent();intent.setAction("ACTION_ALLTIME");intent.putExtra("action_time", media.getDuration());sendBroadcast(intent);}Runnable mrunable = new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubIntent intent = new Intent();intent.setAction("ACTION_CURRENTTIME");intent.putExtra("action_currentime", media.getCurrentPosition());sendBroadcast(intent);//当前时间的运行线程handler.postDelayed(mrunable, 1000);}};//判断歌词显示public int LrcIndex() {int nowtime = 0, alltime = 0, index = 0;if (media.isPlaying()) {nowtime = media.getCurrentPosition();alltime = media.getDuration();}//播放的当前时间小于歌词总时间if (nowtime < alltime) {for (int i = 0; i < lrcList.size(); i++) {if (i < lrcList.size() - 1) {if (nowtime < lrcList.get(i).getTime() && i == 0) {index = i;}if (nowtime > lrcList.get(i).getTime() && nowtime < lrcList.get(i + 1).getTime()) {index = i;}}if (i == lrcList.size() - 1 && nowtime > lrcList.get(i).getTime()) {index = i;}}}return index;}Runnable lrcRunnable = new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubString lrc = null;if(lrcList.size()>0){lrc = lrcList.get(LrcIndex()).getLrc();}else{lrc="没有歌词,请去下载!";}Intent intent = new Intent();intent.setAction("ACTION_TEXTGC");intent.putExtra("gc", lrc);sendBroadcast(intent);//歌词显示线程lrchandler.postDelayed(lrcRunnable, 1000);}};}<span style="color:#ff0000;"></span>
0 0
- Android开发---音乐播放器(服务类的实现)
- Android开发---音乐播放器(Activity实现)
- 最简单、简易的android音乐播放器,android开发应用之(音乐播放)
- Android-Service (基本知识,生命周期,实例-startService 启动的服务音乐播放器后台服务播放)
- Android-Service (基本知识,生命周期,实例-startService 启动的服务音乐播放器后台服务播放)
- 基于android的网络音乐播放器-回调实现音乐播放及音乐收藏的实现(三)
- Android开发:服务与多线程--简单音乐播放器
- android音乐播放器的开发实例
- Android之Service服务实现音乐播放器
- Android 音乐播放器的开发教程(十一)SQLite的使用及最近播放的实现 ----- 小达
- 实现一个android的音乐播放器
- Android:音乐播放器的实现
- Android 音乐播放器的实现
- Android简易的音乐播放器实现
- android实现简单的音乐播放器
- Android音乐播放器的简单实现
- android 简易音乐播放器的实现
- android-----音乐播放器的音量控制功能(开发)
- android中UDP编程的注意事项
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
- 【latched】Single Number II
- Oracle11g新特性影响EXP导出,ORA-01455的处理
- mybatis 校验报错问题[myeclipse 8.5]
- Android开发---音乐播放器(服务类的实现)
- ORA-00257 archiver error. 错误的处理方法
- 南邮 OJ 1383 Knights
- 基础知识(六)KD-Tree快速最近邻搜索
- UIScrollView那些事
- 深入理解HTTP协议
- Mac 键盘快捷键
- svn解决冲突
- EFContext 用到的知识点