1. 程式人生 > 其它 >Android學習——播放音訊

Android學習——播放音訊

在Android中播放音訊檔案一般都使用MediaPlayer類來實現的,它對多種格式的音訊檔案提供了非常全面的控制方法,從而使得播放音樂的工作變得十分簡單,下面是MediaPlayer類中的一些比較常用的控制方法

setDataSource() //設定要播放的音訊檔案的位置
prepare() //在開始播放之前呼叫這個方法完成準備工作
start() //開始或繼續播放音訊
pause() //暫停播放音訊
reset() //將MediaPlayer物件重置到剛剛建立的狀態
seekTo() //從指定的位置開始播放視訊
stop() //停止播放音訊,呼叫這個方法後的MediaPlayer物件無法再播放音訊
release() //
釋放掉與MediaPlayer物件相關的資源 isPlaying() //判斷當前MediaPlayer是否正在播放音訊 getDuration() //獲取載入的音訊檔案的時長

MediaPlayer的工作流程,首先需要創建出一個MediaPlayer物件,然後呼叫setDataSource()方法來設定音訊檔案的路徑,再呼叫prepare()方法使MediaPlayer進入到準備狀態,接下來呼叫start()方法就可以開始播放音訊,呼叫pause()方法就會暫停播放,呼叫reset()方法就會停止播放.

新建一個PlayAudioTest專案,然後修改activity_main.xml程式碼:

<LinearLayout xmlns:android="
http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/play" android:layout_width="match_parent" android:layout_height="wrap_content" android:text
="Play" /> <Button android:id="@+id/pause" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Pause"/> <Button android:id="@+id/stop" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Stop"/> </LinearLayout>

佈局中放置了三個按鈕,分別對於音訊檔案進行播放,暫停和停止操作,然後修改MainActivity程式碼

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private MediaPlayer mediaPlayer = new MediaPlayer();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.audio);
        Button play = (Button)findViewById(R.id.play);
        Button pause = (Button)findViewById(R.id.pause);
        Button stop = (Button)findViewById(R.id.stop);
        play.setOnClickListener(this);
        pause.setOnClickListener(this);
        stop.setOnClickListener(this);
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(MainActivity.this, new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE }, 1);
        } else {
            initMediaPlayer();//初始化MediaPlayer
        }
    }

    private void initMediaPlayer(){
        try {
            File file = new File(Environment.getExternalStorageDirectory(), "music.mp3");
            mediaPlayer.setDataSource(file.getPath());//指定音訊檔案的路徑
            mediaPlayer.prepare();//讓MediaPlayer進入到準備狀態
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode){
            case 1:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    initMediaPlayer();
                } else {
                    Toast.makeText(this, "拒絕許可權將無法使用程式", Toast.LENGTH_SHORT).show();
                    finish();
                }
                break;
            default:
                break;
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.play:
                if (!mediaPlayer.isPlaying()){
                    mediaPlayer.start();//開始播放
                }
                break;
            case R.id.pause:
                if (mediaPlayer.isPlaying()){
                    mediaPlayer.pause();//暫停播放
                }
                break;
            case R.id.stop:
                if (mediaPlayer.isPlaying()){
                    mediaPlayer.reset();//停止播放
                    initMediaPlayer();
                }
                break;
            default:
                break;
        }

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mediaPlayer != null){
            mediaPlayer.stop();
            mediaPlayer.release();
        }
    }
}

可以看到,在類的初始化的時候我們先建立一個MediaPlayer例項,然後在onCreate()方法中進行執行時許可權的處理,動態申請WRITE_EXTERNAL_STORAGE的許可權,是因為我們會在SD卡中放置一個音訊檔案,程式為了播放這個音訊檔案必須擁有訪問SD卡的許可權才行.
注意:在onRequestPermissionsResult()方法中,如果使用者拒絕了許可權申請,那麼就呼叫finish()方法將程式直接關閉掉,因為如果沒有SD卡的訪問許可權,我們這個程式將什麼都幹不了.
使用者同意授權之後就會呼叫initMediaPlayer()方法為MediaPlayer物件進行初始化操作.在initMediaPlayer()方法中,首先建立一個File物件來指定音訊檔案的路徑,從這裡可以看出,我們需要事先在SD卡目錄下放置一個名為music.mp3的音訊檔案,後面依次呼叫setDataSource()方法和prepare()方法,為MediaPlayer做好了播放前的準備.
當點選Play按鈕的時候會進行判斷,如果當前的MediaPlayer沒有正在播放音訊,則呼叫start()方法開始播放,當點選Pause按鈕的時候會判斷,如果當前MediaPlayer正在播放音訊,則呼叫pause()方法暫停播放,當點選Stop按鈕的時候會判斷,如果當前MediaPlayer正在播放音訊,則呼叫reset()方法將MediaPlayer重置為剛剛建立的狀態,然後重新呼叫一遍initMediaPlayer()方法. 最後在onDestroy()方法中,還需要分別呼叫stop()方法和release()方法,將與MediaPlayer相關的資源釋放掉 ,千萬不要忘記在AndroidManifest.xml中宣告要申請的許可權

1 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
2     package="com.example.playaudiotest">
3     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
4     ...
5 </manifest>