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>