天天看点

-Android提高第一篇之MediaPlayer

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

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

main.xml的源码:

  1. [xhtml] view plaincopyprint?
  2. <?xml version="1.0" encoding="utf-8"?>  
  3. <LinearLayout android:id="@+id/LinearLayout01"  
  4.     android:layout_width="fill_parent" android:layout_height="fill_parent"  
  5.     xmlns:android="http://schemas.android.com/apk/res/android"  
  6.     android:orientation="vertical">  
  7.     <SeekBar android:id="@+id/SeekBar01" android:layout_height="wrap_content"  
  8.         android:layout_width="fill_parent"></SeekBar>  
  9.     <LinearLayout android:id="@+id/LinearLayout02"  
  10.         android:layout_width="wrap_content" android:layout_height="wrap_content">  
  11.         <Button android:id="@+id/Button01" android:layout_width="wrap_content"  
  12.             android:layout_height="wrap_content" android:text="播放音频"></Button>  
  13.         <Button android:id="@+id/Button02" android:layout_width="wrap_content"  
  14.             android:layout_height="wrap_content" android:text="停止播放"></Button>  
  15.     </LinearLayout>  
  16.     <SeekBar android:id="@+id/SeekBar02" android:layout_height="wrap_content"  
  17.         android:layout_width="fill_parent"></SeekBar>  
  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>  

复制代码

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

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