Android之MediaPlayer

    Android的MediaPlayer包含了Audio和video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer实现的。

    MediaPlayer在底层是基于OpenCore(PacketVideo)的库实现的,为了构建一个MediaPlayer程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制。

   首先我们的播放器可能不只是希望播放一种格式的音乐,而且还需要自动识别指定的路径中哪些是可以播放的音频文件,哪些是不支持的格式,我们可以通过下面的代码来过滤文件类型:

Java代码   收藏代码
  1. class MusicFilter implements FilenamFilter{  
  2.     public boolean accept(File dir,String name){  
  3.         return(name.endWith(".mps3"));  
  4.     }  
  5. }  
  6.     

    现在我们已经得到了能够播放的音频文件,如何来实现一个播放列表的界面呢?本例我们使用ListActivity布局来实现。但是我们还需要几个按钮来表示开始、暂停等操作,我们使用ImageButton来实现,下面是我们的播放器的界面。

   现在我们需要指定音乐文件的位置,本例我们设置路径为“/sdcard/”,因此我们需要向SD卡中添加音频文件。步骤如下:启动模拟器,在Eclipse上选择DDMS窗口,选择File Explorer标签,向左、向右箭头分别是拷贝进、拷贝出指定位置,减号则是删除选中的文件。

   现在我们只需要设置这些ImageButton按钮的时间来处理相应的动作即可播放音乐,首先调用Reset(),这样做将重置MediaPlayer到它的正常状态,这是必须的。如果正在放一首歌曲,同事又想去改变这个数据源,这个Reset()功能也将停止任何正在播放的歌曲。因此,如果一首歌曲是播放状态,同事我们又要选择另一首歌曲,那么它将在启动下一首歌曲之前停止这首正在播放的歌曲。然后我们通过路径找到这首歌曲(setDataSource(String))同事调用prepare()和Start()。在这里指向MediaPlayer将启动播放你的歌曲。接下来的工作就是去装备一个OnCompletionLister(setOnCompletionListener(newOnCompletionListener())).在歌曲结束的时候,onCompletion(MediaPlayer)这个功能将被调用。比如我们可以在这里设置自动播放下一首歌曲。下面我们老看看具体的实现代码。

Java代码   收藏代码
  1. package com.yarin.android.Examples_07_01;  
  2.   
  3. import java.io.File;  
  4. import java.io.FilenameFilter;  
  5. import java.io.IOException;  
  6. import java.util.ArrayList;  
  7. import java.util.List;  
  8. import android.app.ListActivity;  
  9. import android.media.MediaPlayer;  
  10. import android.media.MediaPlayer.OnCompletionListener;  
  11. import android.os.Bundle;  
  12. import android.view.KeyEvent;  
  13. import android.view.View;  
  14. import android.widget.ArrayAdapter;  
  15. import android.widget.ImageButton;  
  16. import android.widget.ListView;  
  17.   
  18. public class Activity01 extends ListActivity   
  19. {  
  20.     /* 几个操作按钮 */  
  21.     private ImageButton mFrontImageButton   = null;  
  22.     private ImageButton mStopImageButton    = null;  
  23.     private ImageButton mStartImageButton   = null;  
  24.     private ImageButton mPauseImageButton   = null;  
  25.     private ImageButton mNextImageButton    = null;  
  26.   
  27.     /* MediaPlayer对象 */  
  28.     public MediaPlayer  mMediaPlayer        = null;  
  29.       
  30.     /* 播放列表 */  
  31.     private List<String> mMusicList = new ArrayList<String>();  
  32.       
  33.     /* 当前播放歌曲的索引 */  
  34.     private int currentListItme = 0;  
  35.       
  36.     /* 音乐的路径 */  
  37.     private static final String MUSIC_PATH = new String("/sdcard/");  
  38.   
  39.     /** Called when the activity is first created. */  
  40.     @Override  
  41.     public void onCreate(Bundle savedInstanceState)  
  42.     {  
  43.         super.onCreate(savedInstanceState);  
  44.         setContentView(R.layout.main);  
  45.         /* 更新显示播放列表 */  
  46.         musicList();  
  47.         /* 构建MediaPlayer对象 */  
  48.         mMediaPlayer        = new MediaPlayer();  
  49.   
  50.         mFrontImageButton = (ImageButton) findViewById(R.id.LastImageButton);   
  51.         mStopImageButton = (ImageButton) findViewById(R.id.StopImageButton);  
  52.         mStartImageButton = (ImageButton) findViewById(R.id.StartImageButton);   
  53.         mPauseImageButton = (ImageButton) findViewById(R.id.PauseImageButton);  
  54.         mNextImageButton = (ImageButton) findViewById(R.id.NextImageButton);   
  55.           
  56.         //停止按钮  
  57.         mStopImageButton.setOnClickListener(new ImageButton.OnClickListener()   
  58.         {  
  59.             @Override  
  60.             public void onClick(View v)  
  61.             {  
  62.                 /* 是否正在播放 */  
  63.                 if (mMediaPlayer.isPlaying())  
  64.                 {  
  65.                     //重置MediaPlayer到初始状态  
  66.                     mMediaPlayer.reset();  
  67.                 }  
  68.             }  
  69.         });   
  70.           
  71.         //开始按钮  
  72.         mStartImageButton.setOnClickListener(new ImageButton.OnClickListener()   
  73.         {  
  74.             @Override  
  75.             public void onClick(View v)  
  76.             {  
  77.                 playMusic(MUSIC_PATH + mMusicList.get(currentListItme));  
  78.             }  
  79.         });    
  80.           
  81.         //暂停  
  82.         mPauseImageButton.setOnClickListener(new ImageButton.OnClickListener()   
  83.         {  
  84.             public void onClick(View view)  
  85.             {  
  86.                 if (mMediaPlayer.isPlaying())  
  87.                 {  
  88.                     /* 暂停 */  
  89.                     mMediaPlayer.pause();  
  90.                 }  
  91.                 else   
  92.                 {  
  93.                     /* 开始播放 */  
  94.                     mMediaPlayer.start();  
  95.                 }  
  96.             }  
  97.         });  
  98.           
  99.         //下一首  
  100.         mNextImageButton.setOnClickListener(new ImageButton.OnClickListener()   
  101.         {  
  102.             @Override  
  103.             public void onClick(View arg0)  
  104.             {  
  105.                 nextMusic();  
  106.             }  
  107.         });  
  108.         //上一首  
  109.         mFrontImageButton.setOnClickListener(new ImageButton.OnClickListener()   
  110.         {  
  111.             @Override  
  112.             public void onClick(View arg0)  
  113.             {  
  114.                 FrontMusic();  
  115.             }  
  116.         });  
  117.     }  
  118.       
  119.     public boolean onKeyDown(int keyCode, KeyEvent event)  
  120.     {  
  121.         if ( keyCode ==  KeyEvent.KEYCODE_BACK)  
  122.         {  
  123.             mMediaPlayer.stop();  
  124.             mMediaPlayer.release();  
  125.             this.finish();  
  126.             return true;  
  127.         }  
  128.         return super.onKeyDown(keyCode, event);  
  129.     }  
  130.       
  131.       
  132.     @Override  
  133.     /* 当我们点击列表时,播放被点击的音乐 */  
  134.     protected void onListItemClick(ListView l, View v, int position, long id)  
  135.     {  
  136.         currentListItme = position;  
  137.         playMusic(MUSIC_PATH + mMusicList.get(position));  
  138.     }  
  139.   
  140.   
  141.     /* 播放列表 */  
  142.     public void musicList()  
  143.     {  
  144.         //取得指定位置的文件设置显示到播放列表  
  145.         File home = new File(MUSIC_PATH);  
  146.         if (home.listFiles(new MusicFilter()).length > 0)  
  147.         {  
  148.             for (File file : home.listFiles(new MusicFilter()))  
  149.             {  
  150.                 mMusicList.add(file.getName());  
  151.             }  
  152.             ArrayAdapter<String> musicList = new ArrayAdapter<String>(Activity01.this,R.layout.musicitme, mMusicList);  
  153.             setListAdapter(musicList);  
  154.         }  
  155.     }  
  156.       
  157.     private void playMusic(String path)  
  158.     {  
  159.         try  
  160.         {  
  161.             /* 重置MediaPlayer */  
  162.             mMediaPlayer.reset();  
  163.             /* 设置要播放的文件的路径 */  
  164.             mMediaPlayer.setDataSource(path);  
  165.             /* 准备播放 */  
  166.             mMediaPlayer.prepare();  
  167.             /* 开始播放 */  
  168.             mMediaPlayer.start();  
  169.             mMediaPlayer.setOnCompletionListener(new OnCompletionListener()   
  170.             {  
  171.                 public void onCompletion(MediaPlayer arg0)  
  172.                 {  
  173.                     //播放完成一首之后进行下一首  
  174.                     nextMusic();  
  175.                 }  
  176.             });  
  177.         }catch (IOException e){}  
  178.     }  
  179.   
  180.     /* 下一首 */  
  181.     private void nextMusic()  
  182.     {  
  183.         if (++currentListItme >= mMusicList.size())  
  184.         {  
  185.             currentListItme = 0;  
  186.         }  
  187.         else  
  188.         {  
  189.             playMusic(MUSIC_PATH + mMusicList.get(currentListItme));  
  190.         }  
  191.     }  
  192.       
  193.     /* 上一首 */  
  194.     private void FrontMusic()  
  195.     {  
  196.         if (--currentListItme >= 0)  
  197.         {  
  198.             currentListItme = mMusicList.size();  
  199.         }  
  200.         else  
  201.         {  
  202.             playMusic(MUSIC_PATH + mMusicList.get(currentListItme));  
  203.         }  
  204.     }  
  205.   
  206. }  
  207.   
  208. /* 过滤文件类型 */  
  209. class MusicFilter implements FilenameFilter  
  210. {  
  211.     public boolean accept(File dir, String name)  
  212.     {  
  213.         //这里还可以设置其他格式的音乐文件  
  214.         return (name.endsWith(".mp3"));  
  215.     }  
  216. }  

     现在我们已经知道如何播放指定SD卡上的音乐了,但是大家是否想到,我们在应用时(比如游戏中的音效),肯定是需要和我们的程序一起打包发布的,这样音乐就没有存在于SD卡上了,一般情况下会放在应用的目录下的“res\raw\”中,那么如何播放这样的音乐呢,其实很简单,只需要把上面的例子中的setDataSource 方法改成有create方法来创建一个指定的资源索引的MediaPlayer对象,其他操作基本一。代码如下:

Java代码   收藏代码
  1. package com.yarin.android.Examples_07_02;  
  2.   
  3. import java.io.IOException;  
  4. import android.app.Activity;  
  5. import android.media.MediaPlayer;  
  6. import android.media.MediaPlayer.OnCompletionListener;  
  7. import android.os.Bundle;  
  8. import android.view.KeyEvent;  
  9. import android.view.View;  
  10. import android.widget.ImageButton;  
  11. import android.widget.TextView;  
  12.   
  13. public class Activity01 extends Activity  
  14. {  
  15.     private ImageButton mStopImageButton;  
  16.     private ImageButton mStartImageButton;  
  17.     private ImageButton mPauseImageButton;  
  18.     private TextView mTextView;   
  19.   
  20.     private boolean     bIsReleased     = false;  
  21.     private boolean     bIsPaused       = false;  
  22.     private boolean     bIsPlaying      = false;  
  23.   
  24.     public MediaPlayer mMediaPlayer = new MediaPlayer();  ;  
  25.     /** Called when the activity is first created. */  
  26.     @Override  
  27.     public void onCreate(Bundle savedInstanceState)  
  28.     {  
  29.         super.onCreate(savedInstanceState);  
  30.         setContentView(R.layout.main);  
  31.   
  32.         mStopImageButton = (ImageButton) findViewById(R.id.StopImageButton);  
  33.         mStartImageButton = (ImageButton) findViewById(R.id.StartImageButton);   
  34.         mPauseImageButton = (ImageButton) findViewById(R.id.PauseImageButton);  
  35.           
  36.         mTextView = (TextView) findViewById(R.id.TextView01);   
  37.           
  38.         //停止按钮  
  39.         mStopImageButton.setOnClickListener(new ImageButton.OnClickListener()   
  40.         {  
  41.             @Override  
  42.             public void onClick(View v)  
  43.             {  
  44.                 if (bIsPlaying == true)  
  45.                 {  
  46.                     if ( !bIsReleased )  
  47.                     {  
  48.                         mMediaPlayer.stop();  
  49.                         mMediaPlayer.release();  
  50.                         bIsReleased = true;   
  51.                     }  
  52.                     bIsPlaying = false;  
  53.                     mTextView.setText("当前处于停止状态,请按开始进行音乐播放!");  
  54.                 }  
  55.             }  
  56.         });   
  57.           
  58.         //开始按钮  
  59.         mStartImageButton.setOnClickListener(new ImageButton.OnClickListener()   
  60.         {  
  61.             @Override  
  62.             public void onClick(View v)  
  63.             {  
  64.                 try  
  65.                 {  
  66.                     if ( !bIsPlaying )  
  67.                     {  
  68.                         bIsPlaying = true;  
  69.                         /* 装载资源中的音乐 */  
  70.                         mMediaPlayer = MediaPlayer.create(Activity01.this, R.raw.test);  
  71.                         bIsReleased = false;  
  72.                         /* 设置是否循环 */  
  73.                         mMediaPlayer.setLooping(true);  
  74.                         try  
  75.                         {  
  76.                             mMediaPlayer.prepare();  
  77.                         }  
  78.                         catch (IllegalStateException e)  
  79.                         {  
  80.                             e.printStackTrace();  
  81.                         }  
  82.                         catch (IOException e)  
  83.                         {  
  84.                             e.printStackTrace();  
  85.                         }  
  86.                         mMediaPlayer.start();  
  87.                         mTextView.setText("当前正在播放音乐!");  
  88.                     }  
  89.                 }  
  90.                 catch (IllegalStateException e)  
  91.                 {  
  92.                     e.printStackTrace();  
  93.                 }  
  94.                 mMediaPlayer.setOnCompletionListener(new OnCompletionListener()   
  95.                 {  
  96.                     // @Override  
  97.                     public void onCompletion(MediaPlayer arg0)  
  98.                     {  
  99.                         mMediaPlayer.release();   
  100.                     }  
  101.                 });  
  102.             }  
  103.         });    
  104.           
  105.         //暂停  
  106.         mPauseImageButton.setOnClickListener(new ImageButton.OnClickListener()   
  107.         {  
  108.             public void onClick(View view)  
  109.             {  
  110.                 if (mMediaPlayer != null)  
  111.                 {  
  112.                     if (bIsReleased == false)  
  113.                     {  
  114.                         if (bIsPaused == false)  
  115.                         {  
  116.                             mMediaPlayer.pause();  
  117.                             bIsPaused = true;  
  118.                             bIsPlaying = true;  
  119.                             mTextView.setText("已经暂停,请再次按暂停按钮回复播放!");  
  120.                         }  
  121.                         else if (bIsPaused == true)  
  122.                         {  
  123.                             mMediaPlayer.start();  
  124.                             bIsPaused = false;  
  125.                             mTextView.setText("音乐恢复播放!");  
  126.                         }  
  127.                     }  
  128.                 }  
  129.             }  
  130.         });  
  131.     }  
  132.       
  133.     public boolean onKeyDown(int keyCode, KeyEvent event)  
  134.     {  
  135.         if ( keyCode ==  KeyEvent.KEYCODE_BACK)  
  136.         {  
  137.             if ( !bIsReleased )  
  138.             {  
  139.                 mMediaPlayer.stop();  
  140.                 mMediaPlayer.release();  
  141.                 bIsReleased = true;   
  142.             }  
  143.             this.finish();  
  144.             return true;  
  145.         }  
  146.         return super.onKeyDown(keyCode, event);  
  147.     }  
  148. }  

 

细心的读者已经发现create方法不仅可以加载应用程序中资源的索引,还可加载一个URI地址,当然这就说明我们同样可以很轻松地播放网络音乐,核心代码如下:

Java代码   收藏代码
  1. Private MediaPlayer mMediaPlayer;  
  2. Uri uri=Uri.parse("http://www.xxx.com.xxx.mp3");  
  3. mMediaPlayer=MediaPlayer.create(this,uri);  
  4. mMediaPlayer.start();  

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值