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