安卓MP3播放器开发实例(2)之音乐播放

<span style="font-size:18px;">  </span><span style="font-family: Arial, Helvetica, sans-serif;font-size:18px;">上次和大家简单谈了播放器关于MP3列表界面的创建以及MP3文件相关信息的获取。这次主要谈播放界面的工作原理,界面再上一篇已经展示过了,就不再重复展示了。播放的基本原理是开启一个播放的服务(以至于切换到其他应用的界面可以继续播放),,对播放界面的操作都作用于播放的服务。</span>

播放界面中有三个按钮,分别代表三种状态“开始”、“暂停”、“停止”,点击这三个按钮的其中一个,都会作用于播放服务。先看这三个按钮的监听事件:

开始:

class BeginListener implements OnClickListener{@Overridepublic void onClick(View arg0) {Toast.makeText(PlayActivity.this, "播放",Toast.LENGTH_SHORT).show();//音乐播放与否的标志stopMusic = false;Intent intent = new Intent();//intent对象准备开启播放服务intent.setClass(PlayActivity.this, PlayService.class);intent.putExtra("mp3Info", mp3Info);intent.putExtra("MSG", AppConstant.PlayerMsg.PLAY_MSG);//歌词的初始化preparelrc(mp3Info.getLrcName());startService(intent);//绑定播放服务bindService(intent, conn,BIND_AUTO_CREATE);//Runnable对象加入消息队列,在handler绑定的线程中执行,用于歌词更新handler.post(updateTimeCallback);start = System.currentTimeMillis();isPlaying = true;}}

将从列表界面传来的某条MP3的文件信息以及当前的状态(此时为播放状态AppConstant.PlayerMsg.PLAY_MSG)装入Intent对象中,然后开启播放服务PlayService,将Intent携带的对象传入该服务中。至于歌词初始化、播放服务绑定的作用、歌词更新这部分将在下一篇细讲,今天只要知道是什么作用的即可。

暂停和停止也基本一样。

暂停:

class PauseListener implements OnClickListener{@Overridepublic void onClick(View arg0) {Intent intent = new Intent();//intent对象准备开启播放服务intent.setClass(PlayActivity.this, PlayService.class);intent.putExtra("mp3Info", mp3Info);intent.putExtra("MSG", AppConstant.PlayerMsg.PAUSE_MSG);startService(intent);if(isPlaying){Toast.makeText(PlayActivity.this, "暂停",Toast.LENGTH_SHORT).show();//停止歌词的更新handler.removeCallbacks(updateTimeCallback);pauseTime = System.currentTimeMillis();}else{//Runnable对象加入消息队列,在handler绑定的线程中执行,用于歌词更新handler.postDelayed(updateTimeCallback, 5);Toast.makeText(PlayActivity.this, "继续播放",Toast.LENGTH_SHORT).show();start = System.currentTimeMillis() – pauseTime+start;//保存现场}isPlaying = isPlaying?false:true;}}

停止:

class StopListener implements OnClickListener{@Overridepublic void onClick(View arg0) {Toast.makeText(PlayActivity.this, "停止",Toast.LENGTH_SHORT).show();stopMusic = true;seekBar.setProgress(0);Intent intent = new Intent();intent.setClass(PlayActivity.this, PlayService.class);intent.putExtra("mp3Info", mp3Info);intent.putExtra("MSG", AppConstant.PlayerMsg.STOP_MSG);startService(intent);//停止歌词的更新handler.removeCallbacks(updateTimeCallback);}}

来看下播放服务的代码:

@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {if(intent.getIntExtra("progress", 0) != 0){///////////////////////if(isPlay){//进度条进度int progress = intent.getIntExtra("progress", 0);if(progress != 0)mediaPlayer.seekTo(progress*totalLength/100);}}//////////////////////////else{mp3Info = (MP3Info) intent.getSerializableExtra("mp3Info");int MSG = intent.getIntExtra("MSG", 0);if(mp3Info != null){if(MSG == AppConstant.PlayerMsg.PLAY_MSG){play(mp3Info);}else if(MSG == AppConstant.PlayerMsg.PAUSE_MSG){pause();}else if(MSG == AppConstant.PlayerMsg.STOP_MSG){stop();}}}return super.onStartCommand(intent, flags, startId);}

当startService()被调用时,服务实例就会被创建,并且调用服务的onStartCommand()方法,在该方法中关于进度条进度的,下篇再细讲。这里该方法主要获得从播放界面传过来的Intent对象,获得Intent对象携带的关于播放状态的信息。然后根据不同的状态调用不同的方法。

开始播放:

public void play(MP3Info mp3Info){if(!isPlay){//获得了被点击的mp3文件名String path = getPath(mp3Info);//由MP3文件路径创建一个MediaPlayermediaPlayer = MediaPlayer.create(PlayService.this,Uri.parse("file://"+path));//获得音乐长度totalLength = mediaPlayer.getDuration();///////////////////////是否循环播放mediaPlayer.setLooping(false);//开始播放mediaPlayer.start();//设置标志位isPlay = true;isStop = false;}}

暂停:

在人生的道路上,谁都会遇到困难和挫折,

安卓MP3播放器开发实例(2)之音乐播放

相关文章:

你感兴趣的文章:

标签云: