Android 的 MediaPlayer 多媒體播放器

fmms 12年前發布 | 31K 次閱讀 Android Android開發 移動開發

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

Android 的 MediaPlayer 多媒體播放器
main.xml
<?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&quot;
    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></pre>

package com.testMedia;

import java.io.IOException;
import java.util.Timer; import java.util.TimerTask; import android.app.Activity;
import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Bundle;
import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View;
import android.widget.Button;
import android.widget.SeekBar; import android.widget.Toast;

public class TestMedia extends Activity { /* Called when the activity is first created. /

private SeekBar skb_audio=null;
private Button btn_start_audio = null;  
private Button btn_stop_audio = null;

private SeekBar skb_video=null;
private Button btn_start_video = null;  
private Button btn_stop_video = null;
private SurfaceView surfaceView; 
private SurfaceHolder surfaceHolder; 

private MediaPlayer m = null;  
private Timer mTimer;
private TimerTask mTimerTask;

private boolean isChanging=false;//互斥變量,防止定時器與SeekBar拖動時進度沖突
 @Override  
public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.main);  

    //----------Media控件設置---------//
    m=new MediaPlayer();

    //播放結束之后彈出提示
    m.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){
        @Override
        public void onCompletion(MediaPlayer arg0) {
            Toast.makeText(testMedia.this, "結束", 1000).show();
            m.release();
        }
    });

  //----------定時器記錄播放進度---------//
    mTimer = new Timer();
    mTimerTask = new TimerTask() {
        @Override
        public void run() { 
            if(isChanging==true)
                return;

            if(m.getVideoHeight()==0)
                skb_audio.setProgress(m.getCurrentPosition());
            else 
                skb_video.setProgress(m.getCurrentPosition());
        }
    };

    mTimer.schedule(mTimerTask, 0, 10);

    btn_start_audio = (Button) this.findViewById(R.id.Button01);  
    btn_stop_audio = (Button) this.findViewById(R.id.Button02);  
    btn_start_audio.setOnClickListener(new ClickEvent());
    btn_stop_audio.setOnClickListener(new ClickEvent());
    skb_audio=(SeekBar)this.findViewById(R.id.SeekBar01);
    skb_audio.setOnSeekBarChangeListener(new SeekBarChangeEvent());

    btn_start_video = (Button) this.findViewById(R.id.Button03);  
    btn_stop_video = (Button) this.findViewById(R.id.Button04);  
    btn_start_video.setOnClickListener(new ClickEvent());
    btn_stop_video.setOnClickListener(new ClickEvent());
    skb_video=(SeekBar)this.findViewById(R.id.SeekBar02);
    skb_video.setOnSeekBarChangeListener(new SeekBarChangeEvent());
    surfaceView = (SurfaceView) findViewById(R.id.SurfaceView01);
    surfaceHolder = surfaceView.getHolder();
    surfaceHolder.setFixedSize(100, 100);
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}  

/**

  • 按鍵事件處理 */ class ClickEvent implements View.OnClickListener{ @Override public void onClick(View v) { if(v==btn_start_audio) {

       m.reset();//恢復到未初始化的狀態
       m=MediaPlayer.create(testMedia.this, R.raw.big);//讀取音頻
       skb_audio.setMax(m.getDuration());//設置SeekBar的長度
       try {                   
           m.prepare();    //準備
       } catch (IllegalStateException e) {         
           // TODO Auto-generated catch block              
           e.printStackTrace();                
       } catch (IOException e) {           
           // TODO Auto-generated catch block              
           e.printStackTrace();                
       }       
       m.start();  //播放
    

    } else if(v==btn_stop_audio || v==btn_stop_video) {

       m.stop();
    

    } else if(v==btn_start_video) {

       m.reset();//恢復到未初始化的狀態
       m=MediaPlayer.create(testMedia.this, R.raw.test);//讀取視頻
       skb_video.setMax(m.getDuration());//設置SeekBar的長度
       m.setAudioStreamType(AudioManager.STREAM_MUSIC);
       m.setDisplay(surfaceHolder);//設置屏幕
    
       try {
           m.prepare();
    
       } catch (IllegalArgumentException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       } catch (IllegalStateException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       } catch (IOException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }
       m.start();
    

    } } }

    /**

  • SeekBar進度改變事件 */ class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener{

    @Override public void onProgressChanged(SeekBar seekBar, int progress,

       boolean fromUser) {
    

    // TODO Auto-generated method stub

    }

    @Override public void onStartTrackingTouch(SeekBar seekBar) { isChanging=true; }

    @Override public void onStopTrackingTouch(SeekBar seekBar) { m.seekTo(seekBar.getProgress()); isChanging=false;
    }

    }

}</pre>
</div>

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!