仿Mars MP3播放器项目5

  1.mp3的主要功能:即实现播放,暂停,停止

    通过点击在本地上存在的mp3,响应mp3的播放等功能,代码如下:

    

	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		if(mp3Infos != null){
			Mp3Info mp3Info = mp3Infos.get(position);
			Intent intent = new Intent();
			intent.putExtra("mp3Info", mp3Info);
			intent.putExtra("MSG",0);
			intent.setClass(this, PlayerActivity.class);
			startActivity(intent);
		}
		
	}

  通过获取的position来响应,通过Intent传值并跳转到PlayerActivity.class。MSG是用来确定是点击了哪种的Button,在PlayerService中存在对应的代码:

    

 1     @Override
 2     public int onStartCommand(Intent intent, int flags, int startId) {
 3         // TODO Auto-generated method stub
 4         
 5         mp3Info = (Mp3Info)intent.getSerializableExtra("mp3Info");
 6         System.out.println("mp3Info.getLrcName--===" + mp3Info.getLrcName());
 7         //接收MSG,默认值是1
 8         int MSG = intent.getIntExtra("MSG", 0);
 9         System.out.println("MSG:" + MSG);
10         if(mp3Info != null){
11             if(MSG == AppConstant.playMsg.PLAY_MSG){
12                 System.out.println("start play");
13                 play(mp3Info);
14             }else {
15                 if(MSG == AppConstant.playMsg.PAUSE_MSG){
16                     pause();
17                 }else if(MSG == AppConstant.playMsg.STOP_MSG){
18                     stop();
19                 }
20             }
21         }
22         return super.onStartCommand(intent, flags, startId);

 

    播放界面的设计,player.xml代码:

    

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical"
 6     android:paddingTop="10dip"
 7     android:paddingRight="10dip"
 8     android:paddingLeft="10dip"
 9     >
10     <TextView 
11         android:id="@+id/lrcText"
12         android:layout_width="wrap_content"
13         android:layout_height="wrap_content"
14         android:textColor="#ffabcd"
15         />
16     <LinearLayout 
17         android:id="@+id/playerContro"
18         android:orientation="horizontal"
19         android:layout_width="wrap_content"
20         android:layout_height="wrap_content"
21         android:layout_below="@id/lrcText"
22         >
23     <ImageButton
24         android:id="@+id/play"
25         android:layout_width="wrap_content"
26         android:layout_height="wrap_content"
27         android:src="@drawable/play" />
28     <ImageButton
29         android:id="@+id/pause"
30         android:layout_width="wrap_content"
31         android:layout_height="wrap_content"
32         android:src="@drawable/pause"/>
33     <ImageButton
34         android:id="@+id/stop"
35         android:layout_width="wrap_content"
36         android:layout_height="wrap_content"
37         android:src="@drawable/stop"/>
38     </LinearLayout>
39 </LinearLayout>

    这里我们定义一个LinearLayout,其内是1个TextView,这个是用来显示我们后续需要的歌词信息,1个是LinearLayout,里面含有3个ImageButton,分别是播放,暂停,停止

  。注:2个LinearLayout的orientation是不同的。这个UI界面比较简陋,大家可以发挥想象手段去设计个人性化的界面。这里附上一张图:

    

 2.播放功能:

  我们点击了播放的ImageButton,即可以实现播放功能,代码:

 1     class BeginButton implements OnClickListener{
 2 
 3         @Override
 4         public void onClick(View v) {
 5             // TODO Auto-generated method stub
 6             //创建一个Intent对象,用于Service开始播放mp3
 7             Intent intent = new Intent();
 8             intent.setClass(PlayerActivity.this, PlayerService.class);
 9             intent.putExtra("mp3Info", mp3Info);
10             intent.putExtra("MSG", AppConstant.playMsg.PLAY_MSG);
11             //读取LRC文件
12 //            System.out.println("mp3 lrc-->" + mp3Info.getLrcName());
13 //            prepareLrc(mp3Info.getLrcName());
14             startService(intent);
15             //将begin的值置为当前毫秒数
16 //            begin = System.currentTimeMillis();
17 //            //延后5毫秒执行UpdateTimeCallback
18 //            handler.postDelayed(updateTimeCallback, 5);
19 //            isPlaying = true;
20         }
21         
22     }

  这里的注释掉的内容是直接将播放功能在PlayerActivity中实现,但是为了实现后台操作将其封装在Service中实现,函数为play(),代码如下:

    

 1     private void play(Mp3Info mp3Info){
 2         String path = getMp3Path(mp3Info);
 3         mediaPlayer = MediaPlayer.create(this, Uri.parse("file://" + path));
 4         mediaPlayer.setLooping(false);
 5         mediaPlayer.start();
 6         prepareLrc(mp3Info.getLrcName());
 7         begin = System.currentTimeMillis();
 8         //延后5毫秒执行UpdateTimeCallback
 9         handler.postDelayed(updateTimeCallback, 5);
10         isPlaying = true;
11         isReleased = false;
12     }

  a.获取path

  b.mediaPlayer类的start()方法,prepareLrc()方法获取Lrc文件,begin来确定当前的时间(毫秒)。

  

  3.暂停功能:

  点击Pause之后播放暂停,代码如下:

    

 1     class PauseButton implements OnClickListener{
 2 
 3         @Override
 4         public void onClick(View v) {
 5             // TODO Auto-generated method stub
 6             //创建一个Intent对象,用于Service暂停播放mp3
 7             Intent intent = new Intent();
 8             intent.setClass(PlayerActivity.this, PlayerService.class);
 9             intent.putExtra("mp3Info", mp3Info);
10             intent.putExtra("MSG", AppConstant.playMsg.PAUSE_MSG);
11             startService(intent);
12 //            if(isPlaying){
13 //                handler.removeCallbacks(updateTimeCallback);
14 //                //暂停时取得当前时间
15 //                pauseTimeMills = System.currentTimeMillis() ;
16 //            }else{
17 //                //再次播放
18 //                handler.postDelayed(updateTimeCallback, 5);
19 //                //得到再次开始播放的时间
20 //                begin = System.currentTimeMillis() - pauseTimeMills + begin;
21 //            }
22 //            //如果当前状态时暂停的话,点击后状态改为播放;如果是播放的话,点击后改为暂停
23 //            isPlaying = isPlaying?false : true;
24         }

   注释掉的恢复可以实现在PlayerActivity中实现暂停功能,现在放在Service中实现,代码如下:

    

 1     private void pause(){
 2         if(isPlaying){
 3             mediaPlayer.pause();
 4             handler.removeCallbacks(updateTimeCallback);
 5             //暂停时取得当前时间
 6             pauseTimeMills = System.currentTimeMillis() ;
 7         }else{
 8             mediaPlayer.start();
 9             //再次播放
10             handler.postDelayed(updateTimeCallback, 5);
11         //得到再次开始播放的时间
12             begin = System.currentTimeMillis() - pauseTimeMills + begin;
13         }
14         //如果当前状态时暂停的话,点击后状态改为播放;如果是播放的话,点击后改为暂停
15         isPlaying = isPlaying?false : true;
16         
17         
18     }

  这里需要对时间进行重置。

  4.停止功能:

    点击停止,播放中的mp3结束,代码如下:

    

 1     class StopButton implements OnClickListener{
 2         
 3         @Override
 4         public void onClick(View v) {
 5             // TODO Auto-generated method stub
 6             Intent intent = new Intent();
 7             intent.setClass(PlayerActivity.this, PlayerService.class);
 8             intent.putExtra("mp3Info", mp3Info);
 9             intent.putExtra("MSG", AppConstant.playMsg.STOP_MSG);
10             startService(intent);
11             lrcTextView.setText("");
12             //移出updateTimeCallback,不再进行歌词更新
13 //            handler.removeCallbacks(updateTimeCallback);
14         }
15     }

    这里同样将实现代码放入到Service中,其内的代码:

    

 1     private void stop(){
 2         if (mediaPlayer != null) {
 3             if (isPlaying) {
 4                 if (!isReleased) {
 5                     handler.removeCallbacks(updateTimeCallback);
 6                     mediaPlayer.stop();
 7                     mediaPlayer.release();
 8                     isReleased = true;
 9                 }
10                 isPlaying = false;
11                 
12             }
13         }
14     }

    这里通过判断状态来决定停止播放。

    目前大致的MP3的3大功能得以实现。下次将同步实现歌词信息。

  

  

  

posted @ 2013-07-29 11:30  RoseAndroid  阅读(225)  评论(0编辑  收藏  举报