Android之MediaPlayer

Android的MediaPlayer包含瞭Audio和video的播放功能,在Android的界面上,Music和Video兩個應用程序都是調用MediaPlayer實現的。
    MediaPlayer在底層是基於OpenCore(PacketVideo)的庫實現的,為瞭構建一個MediaPlayer程序,上層還包含瞭進程間通訊等內容,這種進程間通訊的基礎是Android基本庫中的Binder機制。

   首先我們的播放器可能不隻是希望播放一種格式的音樂,而且還需要自動識別指定的路徑中哪些是可以播放的音頻文件,哪些是不支持的格式,我們可以通過下面的代碼來過濾文件類型:

Java代碼 
class MusicFilter implements FilenamFilter{ 
    public boolean accept(File dir,String name){ 
        return(name.endWith(".mps3")); 
    } 

   

    現在我們已經得到瞭能夠播放的音頻文件,如何來實現一個播放列表的界面呢?本例我們使用ListActivity佈局來實現。但是我們還需要幾個按鈕來表示開始、暫停等操作,我們使用ImageButton來實現,下面是我們的播放器的界面。

   現在我們需要指定音樂文件的位置,本例我們設置路徑為“/sdcard/”,因此我們需要向SD卡中添加音頻文件。步驟如下:啟動模擬器,在Eclipse上選擇DDMS窗口,選擇File Explorer標簽,向左、向右箭頭分別是拷貝進、拷貝出指定位置,減號則是刪除選中的文件。

   現在我們隻需要設置這些ImageButton按鈕的時間來處理相應的動作即可播放音樂,首先調用Reset(),這樣做將重置MediaPlayer到它的正常狀態,這是必須的。如果正在放一首歌曲,同事又想去改變這個數據源,這個Reset()功能也將停止任何正在播放的歌曲。因此,如果一首歌曲是播放狀態,同事我們又要選擇另一首歌曲,那麼它將在啟動下一首歌曲之前停止這首正在播放的歌曲。然後我們通過路徑找到這首歌曲(setDataSource(String))同事調用prepare()和Start()。在這裡指向MediaPlayer將啟動播放你的歌曲。接下來的工作就是去裝備一個OnCompletionLister(setOnCompletionListener(newOnCompletionListener())).在歌曲結束的時候,onCompletion(MediaPlayer)這個功能將被調用。比如我們可以在這裡設置自動播放下一首歌曲。下面我們老看看具體的實現代碼。

Java代碼 
package com.yarin.android.Examples_07_01; 
 
import java.io.File; 
import java.io.FilenameFilter; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 
import android.app.ListActivity; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnCompletionListener; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.ImageButton; 
import android.widget.ListView; 
 
public class Activity01 extends ListActivity  

    /* 幾個操作按鈕 */ 
    private ImageButton mFrontImageButton   = null; 
    private ImageButton mStopImageButton    = null; 
    private ImageButton mStartImageButton   = null; 
    private ImageButton mPauseImageButton   = null; 
    private ImageButton mNextImageButton    = null; 
 
    /* MediaPlayer對象 */ 
    public MediaPlayer  mMediaPlayer        = null; 
     
    /* 播放列表 */ 
    private List<String> mMusicList = new ArrayList<String>(); 
     
    /* 當前播放歌曲的索引 */ 
    private int currentListItme = 0; 
     
    /* 音樂的路徑 */ 
    private static final String MUSIC_PATH = new String("/sdcard/"); 
 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        /* 更新顯示播放列表 */ 
        musicList(); 
        /* 構建MediaPlayer對象 */ 
        mMediaPlayer        = new MediaPlayer(); 
 
        mFrontImageButton = (ImageButton) findViewById(R.id.LastImageButton);  
        mStopImageButton = (ImageButton) findViewById(R.id.StopImageButton); 
        mStartImageButton = (ImageButton) findViewById(R.id.StartImageButton);  
        mPauseImageButton = (ImageButton) findViewById(R.id.PauseImageButton); 
        mNextImageButton = (ImageButton) findViewById(R.id.NextImageButton);  
         
        //停止按鈕 
        mStopImageButton.setOnClickListener(new ImageButton.OnClickListener()  
        { 
            @Override 
            public void onClick(View v) 
            { 
                /* 是否正在播放 */ 
                if (mMediaPlayer.isPlaying()) 
                { 
                    //重置MediaPlayer到初始狀態 
                    mMediaPlayer.reset(); 
                } 
            } 
        });  
         
        //開始按鈕 
        mStartImageButton.setOnClickListener(new ImageButton.OnClickListener()  
        { 
            @Override 
            public void onClick(View v) 
            { 
                playMusic(MUSIC_PATH + mMusicList.get(currentListItme)); 
            } 
        });   
         
        //暫停 
        mPauseImageButton.setOnClickListener(new ImageButton.OnClickListener()  
        { 
            public void onClick(View view) 
            { 
                if (mMediaPlayer.isPlaying()) 
                { 
                    /* 暫停 */ 
                    mMediaPlayer.pause(); 
                } 
                else  
                { 
                    /* 開始播放 */ 
                    mMediaPlayer.start(); 
                } 
            } 
        }); 
         
        //下一首 
        mNextImageButton.setOnClickListener(new ImageButton.OnClickListener()  
        { 
            @Override 
            public void onClick(View arg0) 
            { 
                nextMusic(); 
            } 
        }); 
        //上一首 
        mFrontImageButton.setOnClickListener(new ImageButton.OnClickListener()  
        { 
            @Override 
            public void onClick(View arg0) 
            { 
                FrontMusic(); 
            } 
        }); 
    } 
     
    public boolean onKeyDown(int keyCode, KeyEvent event) 
    { 
        if ( keyCode ==  KeyEvent.KEYCODE_BACK) 
        { 
            mMediaPlayer.stop(); 
            mMediaPlayer.release(); 
            this.finish(); 
            return true; 
        } 
        return super.onKeyDown(keyCode, event); 
    } 
     
     
    @Override 
    /* 當我們點擊列表時,播放被點擊的音樂 */ 
    protected void onListItemClick(ListView l, View v, int position, long id) 
    { 
        currentListItme = position; 
        playMusic(MUSIC_PATH + mMusicList.get(position)); 
    } 
 
 
    /* 播放列表 */ 
    public void musicList() 
    { 
        //取得指定位置的文件設置顯示到播放列表 
        File home = new File(MUSIC_PATH); 
        if (home.listFiles(new MusicFilter()).length > 0) 
        { 
            for (File file : home.listFiles(new MusicFilter())) 
            { 
                mMusicList.add(file.getName()); 
            } 
            ArrayAdapter<String> musicList = new ArrayAdapter<String>(Activity01.this,R.layout.musicitme, mMusicList); 
            setListAdapter(musicList); 
        } 
    } 
     
    private void playMusic(String path) 
    { 
        try 
        { 
            /* 重置MediaPlayer */ 
            mMediaPlayer.reset(); 
            /* 設置要播放的文件的路徑 */ 
            mMediaPlayer.setDataSource(path); 
            /* 準備播放 */ 
            mMediaPlayer.prepare(); 
            /* 開始播放 */ 
            mMediaPlayer.start(); 
            mMediaPlayer.setOnCompletionListener(new OnCompletionListener()  
            { 
                public void onCompletion(MediaPlayer arg0) 
                { 
                    //播放完成一首之後進行下一首 
                    nextMusic(); 
                } 
            }); 
        }catch (IOException e){} 
    } 
 
    /* 下一首 */ 
    private void nextMusic() 
    { 
        if (++currentListItme >= mMusicList.size()) 
        { 
            currentListItme = 0; 
        } 
        else 
        { 
            playMusic(MUSIC_PATH + mMusicList.get(currentListItme)); 
        } 
    } 
     
    /* 上一首 */ 
    private void FrontMusic() 
    { 
        if (–currentListItme >= 0) 
        { 
            currentListItme = mMusicList.size(); 
        } 
        else 
        { 
            playMusic(MUSIC_PATH + mMusicList.get(currentListItme)); 
        } 
    } 
 

 
/* 過濾文件類型 */ 
class MusicFilter implements FilenameFilter 

    public boolean accept(File dir, String name) 
    { 
        //這裡還可以設置其他格式的音樂文件 
        return (name.endsWith(".mp3")); 
    } 

     現在我們已經知道如何播放指定SD卡上的音樂瞭,但是大傢是否想到,我們在應用時(比如遊戲中的音效),肯定是需要和我們的程序一起打包發佈的,這樣音樂就沒有存在於SD卡上瞭,一般情況下會放在應用的目錄下的“res\raw\”中,那麼如何播放這樣的音樂呢,其實很簡單,隻需要把上面的例子中的setDataSource 方法改成有create方法來創建一個指定的資源索引的MediaPlayer對象,其他操作基本一。代碼如下:

Java代碼 
package com.yarin.android.Examples_07_02; 
 
import java.io.IOException; 
import android.app.Activity; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnCompletionListener; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.view.View; 
import android.widget.ImageButton; 
import android.widget.TextView; 
 
public class Activity01 extends Activity 

    private ImageButton mStopImageButton; 
    private ImageButton mStartImageButton; 
    private ImageButton mPauseImageButton; 
    private TextView mTextView;  
 
    private boolean     bIsReleased     = false; 
    private boolean     bIsPaused       = false; 
    private boolean     bIsPlaying      = false; 
 
    public MediaPlayer mMediaPlayer = new MediaPlayer();  ; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
 
        mStopImageButton = (ImageButton) findViewById(R.id.StopImageButton); 
        mStartImageButton = (ImageButton) findViewById(R.id.StartImageButton);  
        mPauseImageButton = (ImageButton) findViewById(R.id.PauseImageButton); 
         
        mTextView = (TextView) findViewById(R.id.TextView01);  
         
        //停止按鈕 
        mStopImageButton.setOnClickListener(new ImageButton.OnClickListener()  
        { 
            @Override 
            public void onClick(View v) 
            { 
                if (bIsPlaying == true) 
                { 
                    if ( !bIsReleased ) 
                    { 
                        mMediaPlayer.stop(); 
                        mMediaPlayer.release(); 
                        bIsReleased = true;  
                    } 
                    bIsPlaying = false; 
                    mTextView.setText("當前處於停止狀態,請按開始進行音樂播放!"); 
                } 
            } 
        });  
         
        //開始按鈕 
        mStartImageButton.setOnClickListener(new ImageButton.OnClickListener()  
        { 
            @Override 
            public void onClick(View v) 
            { 
                try 
                { 
                    if ( !bIsPlaying ) 
                    { 
                        bIsPlaying = true; 
                        /* 裝載資源中的音樂 */ 
                        mMediaPlayer = MediaPlayer.create(Activity01.this, R.raw.test); 
                        bIsReleased = false; 
                        /* 設置是否循環 */ 
                        mMediaPlayer.setLooping(true); 
                        try 
                        { 
                            mMediaPlayer.prepare(); 
                        } 
                        catch (IllegalStateException e) 
                        { 
                            e.printStackTrace(); 
                        } 
                        catch (IOException e) 
                        { 
                            e.printStackTrace(); 
                        } 
                        mMediaPlayer.start(); 
                        mTextView.setText("當前正在播放音樂!"); 
                    } 
                } 
                catch (IllegalStateException e) 
                { 
                    e.printStackTrace(); 
                } 
                mMediaPlayer.setOnCompletionListener(new OnCompletionListener()  
                { 
                    // @Override 
                    public void onCompletion(MediaPlayer arg0) 
                    { 
                        mMediaPlayer.release();  
                    } 
                }); 
            } 
        });   
         
        //暫停 
        mPauseImageButton.setOnClickListener(new ImageButton.OnClickListener()  
        { 
            public void onClick(View view) 
            { 
                if (mMediaPlayer != null) 
                { 
                    if (bIsReleased == false) 
                    { 
                        if (bIsPaused == false) 
                        { 
                            mMediaPlayer.pause(); 
                            bIsPaused = true; 
                            bIsPlaying = true; 
                            mTextView.setText("已經暫停,請再次按暫停按鈕回復播放!"); 
                        } 
                        else if (bIsPaused == true) 
                        { 
                            mMediaPlayer.start(); 
                            bIsPaused = false; 
                            mTextView.setText("音樂恢復播放!"); 
                        } 
                    } 
                } 
            } 
        }); 
    } 
     
    public boolean onKeyDown(int keyCode, KeyEvent event) 
    { 
        if ( keyCode ==  KeyEvent.KEYCODE_BACK) 
        { 
            if ( !bIsReleased ) 
            { 
                mMediaPlayer.stop(); 
                mMediaPlayer.release(); 
                bIsReleased = true;  
            } 
            this.finish(); 
            return true; 
        } 
        return super.onKeyDown(keyCode, event); 
    } 

 

細心的讀者已經發現create方法不僅可以加載應用程序中資源的索引,還可加載一個URI地址,當然這就說明我們同樣可以很輕松地播放網絡音樂,核心代碼如下:

Java代碼 
Private MediaPlayer mMediaPlayer; 
Uri uri=Uri.parse("https://www.xxx.com.xxx.mp3"); 
mMediaPlayer=MediaPlayer.create(this,uri); 
mMediaPlayer.start();

 

You May Also Like