Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android提高第一篇之MediaPlayer

Android提高第一篇之MediaPlayer

編輯:Android開發實例

      前面寫了十四篇關於界面的入門文章,大家都看完和跟著練習之後,對於常用的Layout和View都會有一定的了解了,接下來的文章就不再強調介紹界面了,而是針對具體的常見功能而展開。

        本文介紹MediaPlayer的使用。MediaPlayer可以播放音頻和視頻,另外也可以通過VideoView來播放視頻,雖然VideoView比MediaPlayer簡單易用,但定制性不如用MediaPlayer,要視情況選擇了。MediaPlayer播放音頻比較簡單,但是要播放視頻就需要SurfaceView。SurfaceView比普通的自定義View更有繪圖上的優勢,它支持完全的OpenGL ES庫。

         先貼出本文程序運行結果的截圖,上面是播放/停止音頻,可用SeekBar來調進度,下面是播放/停止視頻,也是用SeekBar來調進度:

 

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> 

 

本文程序的源碼,有點長:

 

 
  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.     
  166. }  
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved