1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > Android应用开发--MP3音乐播放器Service实现

Android应用开发--MP3音乐播放器Service实现

时间:2023-05-22 19:26:43

相关推荐

Android应用开发--MP3音乐播放器Service实现

Android应用开发--MP3音乐播放器Service实现 5月29日简、美音乐播放器开发记录

让网友们久等啦,关于简、美音乐播放器的开发,最重要的Service类总算是要发博了。关于Android五大组件之一的Service在音乐播放器开发中得到了很好的应用,不仅是Service,广播(Broadcast)、Activity、Content Provider都会在此次开发中用到。所以说对于Android的一个很好的练手项目,音乐播放器是毋庸置疑的。上一篇,主要介绍的是播放界面的业务逻辑实现,不过这些业务逻辑都是以Service为中心的。

package com.wwj.sb.service;import java.util.List;import android.annotation.SuppressLint;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.media.MediaPlayer.OnPreparedListener;import android.os.Handler;import android.os.IBinder;import android.util.Log;import com.wwj.sb.activity.PlayerActivity;import com.wwj.sb.domain.AppConstant;import com.wwj.sb.domain.Mp3Info;import com.wwj.sb.utils.MediaUtil;/**** /5/25* @author wwj* 音乐播放服务*/@SuppressLint("NewApi")public class PlayerService extends Service {private MediaPlayer mediaPlayer; // 媒体播放器对象private String path; // 音乐文件路径private int msg;private boolean isPause; // 暂停状态private int current = 0; // 记录当前正在播放的音乐private List<Mp3Info> mp3Infos;//存放Mp3Info对象的集合private int status = 3;//播放状态,默认为顺序播放private MyReceiver myReceiver;//自定义广播接收器private int currentTime;//当前播放进度private int duration;//播放长度//服务要发送的一些Actionpublic static final String UPDATE_ACTION = "com.wwj.action.UPDATE_ACTION";//更新动作public static final String CTL_ACTION = "com.wwj.action.CTL_ACTION";//控制动作public static final String MUSIC_CURRENT = "com.wwj.action.MUSIC_CURRENT";//当前音乐播放时间更新动作public static final String MUSIC_DURATION = "com.wwj.action.MUSIC_DURATION";//新音乐长度更新动作/*** handler用来接收消息,来发送广播更新播放时间*/private Handler handler = new Handler() {public void handleMessage(android.os.Message msg) {if (msg.what == 1) {if(mediaPlayer != null) {currentTime = mediaPlayer.getCurrentPosition(); // 获取当前音乐播放的位置Intent intent = new Intent();intent.setAction(MUSIC_CURRENT);intent.putExtra("currentTime", currentTime);sendBroadcast(intent); // 给PlayerActivity发送广播handler.sendEmptyMessageDelayed(1, 1000);}}};};@Overridepublic void onCreate() {super.onCreate();Log.d("service", "service created");mediaPlayer = new MediaPlayer();mp3Infos = MediaUtil.getMp3Infos(PlayerService.this);/*** 设置音乐播放完成时的监听器*/mediaPlayer.setOnCompletionListener(new OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {if (status == 1) { // 单曲循环mediaPlayer.start();} else if (status == 2) { // 全部循环current++;if(current > mp3Infos.size() - 1) {//变为第一首的位置继续播放current = 0;}Intent sendIntent = new Intent(UPDATE_ACTION);sendIntent.putExtra("current", current);// 发送广播,将被Activity组件中的BroadcastReceiver接收到sendBroadcast(sendIntent);path = mp3Infos.get(current).getUrl();play(0);} else if (status == 3) { // 顺序播放current++;//下一首位置if (current <= mp3Infos.size() - 1) {Intent sendIntent = new Intent(UPDATE_ACTION);sendIntent.putExtra("current", current);// 发送广播,将被Activity组件中的BroadcastReceiver接收到sendBroadcast(sendIntent);path = mp3Infos.get(current).getUrl();play(0);}else {mediaPlayer.seekTo(0);current = 0;Intent sendIntent = new Intent(UPDATE_ACTION);sendIntent.putExtra("current", current);// 发送广播,将被Activity组件中的BroadcastReceiver接收到sendBroadcast(sendIntent);}} else if(status == 4) {//随机播放current = getRandomIndex(mp3Infos.size() - 1);System.out.println("currentIndex ->" + current);Intent sendIntent = new Intent(UPDATE_ACTION);sendIntent.putExtra("current", current);// 发送广播,将被Activity组件中的BroadcastReceiver接收到sendBroadcast(sendIntent);path = mp3Infos.get(current).getUrl();play(0);}}});myReceiver = new MyReceiver();IntentFilter filter = new IntentFilter();filter.addAction(PlayerActivity.CTL_ACTION);registerReceiver(myReceiver, filter);}/*** 获取随机位置* @param end* @return*/protected int getRandomIndex(int end) {int index = (int) (Math.random() * end);return index;}@Overridepublic IBinder onBind(Intent arg0) {return null;}@Overridepublic void onStart(Intent intent, int startId) {path = intent.getStringExtra("url");//歌曲路径current = intent.getIntExtra("listPosition", -1);//当前播放歌曲的在mp3Infos的位置msg = intent.getIntExtra("MSG", 0);//播放信息if (msg == AppConstant.PlayerMsg.PLAY_MSG) {//直接播放音乐play(0);} else if (msg == AppConstant.PlayerMsg.PAUSE_MSG) {//暂停pause();} else if (msg == AppConstant.PlayerMsg.STOP_MSG) {//停止stop();} else if (msg == AppConstant.PlayerMsg.CONTINUE_MSG) {//继续播放resume();} else if (msg == AppConstant.PlayerMsg.PRIVIOUS_MSG) {//上一首previous();} else if (msg == AppConstant.PlayerMsg.NEXT_MSG) {//下一首next();} else if (msg == AppConstant.PlayerMsg.PROGRESS_CHANGE) {//进度更新currentTime = intent.getIntExtra("progress", -1);play(currentTime);} else if (msg == AppConstant.PlayerMsg.PLAYING_MSG) {handler.sendEmptyMessage(1);}super.onStart(intent, startId);}/*** 播放音乐* * @param position*/private void play(int currentTime) {try {mediaPlayer.reset();// 把各项参数恢复到初始状态mediaPlayer.setDataSource(path);mediaPlayer.prepare(); // 进行缓冲mediaPlayer.setOnPreparedListener(new PreparedListener(currentTime));// 注册一个监听器handler.sendEmptyMessage(1);} catch (Exception e) {e.printStackTrace();}}/*** 暂停音乐*/private void pause() {if (mediaPlayer != null && mediaPlayer.isPlaying()) {mediaPlayer.pause();isPause = true;}}private void resume() {if (isPause) {mediaPlayer.start();isPause = false;}}/*** 上一首*/private void previous() {Intent sendIntent = new Intent(UPDATE_ACTION);sendIntent.putExtra("current", current);// 发送广播,将被Activity组件中的BroadcastReceiver接收到sendBroadcast(sendIntent);play(0);}/*** 下一首*/private void next() {Intent sendIntent = new Intent(UPDATE_ACTION);sendIntent.putExtra("current", current);// 发送广播,将被Activity组件中的BroadcastReceiver接收到sendBroadcast(sendIntent);play(0);}/*** 停止音乐*/private void stop() {if (mediaPlayer != null) {mediaPlayer.stop();try {mediaPlayer.prepare(); // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数} catch (Exception e) {e.printStackTrace();}}}@Overridepublic void onDestroy() {if (mediaPlayer != null) {mediaPlayer.stop();mediaPlayer.release();mediaPlayer = null;}}/*** * 实现一个OnPrepareLister接口,当音乐准备好的时候开始播放* */private final class PreparedListener implements OnPreparedListener {private int currentTime;public PreparedListener(int currentTime) {this.currentTime = currentTime;}@Overridepublic void onPrepared(MediaPlayer mp) {mediaPlayer.start(); // 开始播放if (currentTime > 0) { // 如果音乐不是从头播放mediaPlayer.seekTo(currentTime);}Intent intent = new Intent();intent.setAction(MUSIC_DURATION);duration = mediaPlayer.getDuration();intent.putExtra("duration", duration);//通过Intent来传递歌曲的总长度sendBroadcast(intent);}}public class MyReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {int control = intent.getIntExtra("control", -1);switch (control) {case 1:status = 1; // 将播放状态置为1表示:单曲循环break;case 2:status = 2;//将播放状态置为2表示:全部循环break;case 3:status = 3;//将播放状态置为3表示:顺序播放break;case 4:status = 4;//将播放状态置为4表示:随机播放break;}}}}

以上的代码要注意的是在Service在被调用startService()方法会在回调onStart(),服务是不会被多次创建的,但会多次调用onStart方法,然而通过Intent传过来的数据,也只能在onStart方法内来接收。 似乎关于Service类没什么可说的,简单来说服务是我们看不见的东西,只是在后台不断运行的程序,音乐播放通过服务来实现,才不会在界面不可见的时候停掉,这是音乐播放器使用Service的原因。 第一阶段的音乐播放器开发已经到现在全部介绍完,第二阶段会实现歌词的显示和网络相关的下载和搜索,在这一阶段也会对UI进行一些细微的美化,尽量去尝试实现更炫的效果,比如提供主题的切换,界面切换的动画等等。小巫需要继续去学习,然后把所有东西分享给学习Android的朋友们,感谢你们的关注,让我们一起共同学习进步。 第二阶段具体会什么时候启动,还没有明确的时间,因为最近开始忙起来了,所以尽情等待吧。哇咔咔

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。