Android提高第一篇之MediaPlayer

前面写了十四篇关于界面的入门文章,大家都看完和跟着练习之后,对于常用的Layout和View都会有一定的了解了,接下来的文章就不再强调介绍界面了,而是针对具体的常见功能而展开。

        本 文介绍MediaPlayer的使用。MediaPlayer可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView 比MediaPlayer简单易用,但定制性不如用MediaPlayer,要视情况选择了。MediaPlayer播放音频比较简单,但是要播放视频就 需要SurfaceView。SurfaceView比普通的自定义View更有绘图上的优势,它支持完全的OpenGL ES库。

         先贴出本文程序运行结果的截图,上面是播放/停止音频,可用SeekBar来调进度,下面是播放/停止视频,也是用SeekBar来调进度:

Android提高第一篇之MediaPlayer

 

main.xml的源码:

  1. <? xml   version = "1.0"   encoding = "utf-8" ?>   
  2. < LinearLayout   android:id = "@+id/LinearLayout01"   
  3.     android:layout_width = "fill_parent"   android:layout_height = "fill_parent"   
  4.     xmlns:android = "http://schemas.android.com/apk/res/android"   
  5.     android:orientation = "vertical" >   
  6.     < SeekBar   android:id = "@+id/SeekBar01"   android:layout_height = "wrap_content"   
  7.         android:layout_width = "fill_parent" > </ SeekBar >   
  8.     < LinearLayout   android:id = "@+id/LinearLayout02"   
  9.         android:layout_width = "wrap_content"   android:layout_height = "wrap_content" >   
  10.         < Button   android:id = "@+id/Button01"   android:layout_width = "wrap_content"   
  11.             android:layout_height = "wrap_content"   android:text = "播放音频" > </ Button >   
  12.         < Button   android:id = "@+id/Button02"   android:layout_width = "wrap_content"   
  13.             android:layout_height = "wrap_content"   android:text = "停止播放" > </ Button >   
  14.     </ LinearLayout >   
  15.     < SeekBar   android:id = "@+id/SeekBar02"   android:layout_height = "wrap_content"   
  16.         android:layout_width = "fill_parent" > </ SeekBar >   
  17.   
  18.     < SurfaceView   android:id = "@+id/SurfaceView01"   
  19.         android:layout_width = "fill_parent"   android:layout_height = "250px" > </ SurfaceView >   
  20.     < LinearLayout   android:id = "@+id/LinearLayout02"   
  21.         android:layout_width = "wrap_content"   android:layout_height = "wrap_content" >   
  22.         < Button   android:layout_width = "wrap_content"   
  23.             android:layout_height = "wrap_content"   android:id = "@+id/Button03"   
  24.             android:text = "播放视频" > </ Button >   
  25.         < Button   android:layout_width = "wrap_content"   
  26.             android:layout_height = "wrap_content"   android:text = "停止播放"   android:id = "@+id/Button04" > </ Button >   
  27.     </ LinearLayout >   
  28. </ LinearLayout >   
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:id="@+id/LinearLayout01" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"> <SeekBar android:id="@+id/SeekBar01" android:layout_height="wrap_content" android:layout_width="fill_parent"></SeekBar> <LinearLayout android:id="@+id/LinearLayout02" android:layout_width="wrap_content" android:layout_height="wrap_content"> <Button android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="播放音频"></Button> <Button android:id="@+id/Button02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="停止播放"></Button> </LinearLayout> <SeekBar android:id="@+id/SeekBar02" android:layout_height="wrap_content" android:layout_width="fill_parent"></SeekBar> <SurfaceView android:id="@+id/SurfaceView01" android:layout_width="fill_parent" android:layout_height="250px"></SurfaceView> <LinearLayout android:id="@+id/LinearLayout02" android:layout_width="wrap_content" android:layout_height="wrap_content"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/Button03" android:text="播放视频"></Button> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="停止播放" android:id="@+id/Button04"></Button> </LinearLayout> </LinearLayout>

 

本文程序的源码,有点长:

  1. package  com.testMedia;  
  2.   
  3. import  java.io.IOException;    
  4. import  java.util.Timer;  
  5. import  java.util.TimerTask;  
  6. import  android.app.Activity;    
  7. import  android.media.AudioManager;  
  8. import  android.media.MediaPlayer;  
  9. import  android.os.Bundle;    
  10. import  android.view.SurfaceHolder;  
  11. import  android.view.SurfaceView;  
  12. import  android.view.View;    
  13. import  android.widget.Button;    
  14. import  android.widget.SeekBar;  
  15. import  android.widget.Toast;    
  16.   
  17.   
  18. public   class  testMedia  extends  Activity {  
  19.       /** Called when the activity is first created. */    
  20.   
  21.     private  SeekBar skb_audio= null ;  
  22.     private  Button btn_start_audio =  null ;    
  23.     private  Button btn_stop_audio =  null ;  
  24.   
  25.     private  SeekBar skb_video= null ;  
  26.     private  Button btn_start_video =  null ;    
  27.     private  Button btn_stop_video =  null ;  
  28.     private  SurfaceView surfaceView;   
  29.     private  SurfaceHolder surfaceHolder;   
  30.       
  31.     private  MediaPlayer m =  null ;    
  32.     private  Timer mTimer;  
  33.     private  TimerTask mTimerTask;  
  34.       
  35.     private   boolean  isChanging= false ; //互斥变量,防止定时器与SeekBar拖动时进度冲突   
  36.      @Override     
  37.     public   void  onCreate(Bundle savedInstanceState) {    
  38.         super .onCreate(savedInstanceState);    
  39.         setContentView(R.layout.main);    
  40.           
  41.         //----------Media控件设置---------//   
  42.         m=new  MediaPlayer();  
  43.           
  44.         //播放结束之后弹出提示   
  45.         m.setOnCompletionListener(new  MediaPlayer.OnCompletionListener(){  
  46.             @Override   
  47.             public   void  onCompletion(MediaPlayer arg0) {  
  48.                 Toast.makeText(testMedia.this "结束" 1000 ).show();  
  49.                 m.release();  
  50.             }  
  51.         });  
  52.           
  53.       //----------定时器记录播放进度---------//   
  54.         mTimer = new  Timer();  
  55.         mTimerTask = new  TimerTask() {  
  56.             @Override   
  57.             public   void  run() {   
  58.                 if (isChanging== true )  
  59.                     return ;  
  60.                   
  61.                 if (m.getVideoHeight()== 0 )  
  62.                     skb_audio.setProgress(m.getCurrentPosition());  
  63.                 else    
  64.                     skb_video.setProgress(m.getCurrentPosition());  
  65.             }  
  66.         };  
  67.   
  68.         mTimer.schedule(mTimerTask, 0 10 );  
  69.           
  70.         btn_start_audio = (Button) this .findViewById(R.id.Button01);    
  71.         btn_stop_audio = (Button) this .findViewById(R.id.Button02);    
  72.         btn_start_audio.setOnClickListener(new  ClickEvent());  
  73.         btn_stop_audio.setOnClickListener(new  ClickEvent());  
  74.         skb_audio=(SeekBar)this .findViewById(R.id.SeekBar01);  
  75.         skb_audio.setOnSeekBarChangeListener(new  SeekBarChangeEvent());  
  76.           
  77.         btn_start_video = (Button) this .findViewById(R.id.Button03);    
  78.         btn_stop_video = (Button) this .findViewById(R.id.Button04);    
  79.         btn_start_video.setOnClickListener(new  ClickEvent());  
  80.         btn_stop_video.setOnClickListener(new  ClickEvent());  
  81.         skb_video=(SeekBar)this .findViewById(R.id.SeekBar02);  
  82.         skb_video.setOnSeekBarChangeListener(new  SeekBarChangeEvent());  
  83.         surfaceView = (SurfaceView) findViewById(R.id.SurfaceView01);  
  84.         surfaceHolder = surfaceView.getHolder();  
  85.         surfaceHolder.setFixedSize(100 100 );  
  86.         surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);  
  87.     }    
  88.        
  89.   /*  
  90.    * 按键事件处理  
  91.    */   
  92.   class  ClickEvent  implements  View.OnClickListener{  
  93.     @Override   
  94.     public   void  onClick(View v) {  
  95.         if (v==btn_start_audio)  
  96.         {  
  97.             m.reset();//恢复到未初始化的状态   
  98.             m=MediaPlayer.create(testMedia.this , R.raw.big); //读取音频   
  99.             skb_audio.setMax(m.getDuration());//设置SeekBar的长度   
  100.             try  {                     
  101.                 m.prepare();    //准备   
  102.             } catch  (IllegalStateException e) {           
  103.                 // TODO Auto-generated catch block                 
  104.                 e.printStackTrace();                  
  105.             } catch  (IOException e) {             
  106.                 // TODO Auto-generated catch block                 
  107.                 e.printStackTrace();                  
  108.             }         
  109.             m.start();  //播放   
  110.         }  
  111.         else   if (v==btn_stop_audio || v==btn_stop_video)  
  112.         {  
  113.             m.stop();  
  114.         }  
  115.         else   if (v==btn_start_video)  
  116.         {  
  117.             m.reset();//恢复到未初始化的状态   
  118.             m=MediaPlayer.create(testMedia.this , R.raw.test); //读取视频   
  119.             skb_video.setMax(m.getDuration());//设置SeekBar的长度   
  120.             m.setAudioStreamType(AudioManager.STREAM_MUSIC);  
  121.             m.setDisplay(surfaceHolder);//设置屏幕   
  122.               
  123.             try  {  
  124.                 m.prepare();  
  125.                   
  126.             } catch  (IllegalArgumentException e) {  
  127.                 // TODO Auto-generated catch block   
  128.                 e.printStackTrace();  
  129.             } catch  (IllegalStateException e) {  
  130.                 // TODO Auto-generated catch block   
  131.                 e.printStackTrace();  
  132.             } catch  (IOException e) {  
  133.                 // TODO Auto-generated catch block   
  134.                 e.printStackTrace();  
  135.             }  
  136.             m.start();  
  137.         }  
  138.     }  
  139.   }  
  140.     
  141.   /*  
  142.    * SeekBar进度改变事件  
  143.    */   
  144.   class  SeekBarChangeEvent  implements  SeekBar.OnSeekBarChangeListener{  
  145.   
  146.     @Override   
  147.     public   void  onProgressChanged(SeekBar seekBar,  int  progress,  
  148.             boolean  fromUser) {  
  149.         // TODO Auto-generated method stub   
  150.           
  151.     }  
  152.   
  153.     @Override   
  154.     public   void  onStartTrackingTouch(SeekBar seekBar) {  
  155.         isChanging=true ;  
  156.     }  
  157.   
  158.     @Override   
  159.     public   void  onStopTrackingTouch(SeekBar seekBar) {  
  160.         m.seekTo(seekBar.getProgress());  
  161.         isChanging=false ;     
  162.     }  
  163.         
  164.   }  
  165.