随着移動端技術的飛速發展,現如今手機的功能愈發強大,播放音頻已經是作為一部手機最基本的功能之一了。相信大家手機中都有安裝音樂播放器,比如:QQ音樂、酷狗、“網抑雲音樂”等。這些播放功能都很強大,界面都很美觀。但是畢竟衆口難調,Android給播放音頻和視訊都提供了一套比較完整的API,我們就可以利用其來定制一個自己音頻播放器。
在Android中播放音頻檔案一般是使用MediaPlayer類實作的,它對多種格式的音頻提供了非常全面的控制方法,使得播放音樂的工作變得十分簡單。以下就是MediaPlayer類中的一些常用的方法:
- setDateSource:設定要播放的音頻檔案的位置
- prepare:在開始播放前調用,以完成準備工作
- start:開始或者繼續播放音頻
- pause:暫停播放音頻
- reset:将MediaPlayer對象重置到剛建立的狀态
- seekTo:從指定的位置開始播放音頻
- stop:停止播放音頻,調用後的MediaPlayer對象無法在播放音頻
- release:釋放與MediaPlayer對象相關的資源
- isPlaying:判斷目前MediaPlayer是否正在播放音頻
- getDuration:擷取載入的音頻檔案的時長
對上述方法做了簡單了解後,我們來梳理一下MediaPlayer的工作流程,首先,我們需要建立一個MediaPlayer對象,然後調用setDataSource( )方法設定音頻檔案的路徑,然後再調用prepare( )方法使MediaPlayer進入準備狀态,再調用start( )方法就可以開始播放音頻,pause( )方法暫停播放,調用reset( )方法停止播放。以上就實作一個音頻播放器最基礎的開始播放、暫停播放、結束播放三個功能。
下面我們将通過一個執行個體來學習如何實作一個簡易的音頻播放器,建立一個MusicPlayer項目。然後修改布局代碼,如下:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="MultiMedia.MultiMediaActivity">
<TextView
android:layout_marginTop="50dp"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Music Player"
android:textColor="#EE1111"
android:textSize="40sp"
app:layout_constraintTop_toTopOf="parent"/>
<Button
android:id="@+id/btn_Play"
android:layout_marginTop="150dp"
android:layout_marginLeft="70dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@mipmap/play"
android:background="#FAFAFA"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<Button
android:id="@+id/btn_Pause"
android:layout_marginTop="150dp"
android:layout_marginLeft="20dp"
android:drawableLeft="@mipmap/pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#FAFAFA"
app:layout_goneMarginTop="150dp"
app:layout_constraintLeft_toRightOf="@id/btn_Play"
app:layout_constraintTop_toTopOf="parent"/>
<Button
android:id="@+id/btn_Stop"
android:drawableLeft="@mipmap/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#FAFAFA"
android:layout_marginLeft="20dp"
android:layout_marginTop="150dp"
app:layout_constraintLeft_toRightOf="@id/btn_Pause"
app:layout_constraintTop_toTopOf="parent"/>
androidx.constraintlayout.widget.ConstraintLayout>
界面如下:
可以看到布局中添加了一個TextView和三個Button,分别用于對音頻檔案進行播放、暫停和停止操作。 MediaPlayer可以用于播放網絡上、本地及應用程式安裝包中的音頻,這裡我們主要是來學習如何使用MediaPlayer,是以我們就來播放應用程式安裝包内的音頻檔案。Android Studio允許我們在項目工程中建立一個assets目錄,在該目錄下可以存放任意檔案和子目錄,在應用安裝時,這些目錄和檔案會一并被加載到手機上,然後我們可以在程式中借助AssetManager類提供的接口擷取放在assets目錄下的檔案。 首先我們先來建立一個assets目錄,值得注意的是該目錄必須建立在app/src/main目錄下,與java、res目錄是同級關系,右擊app/src/main--New--Directory,在彈出的對話框中輸入"assets",即可建立。接着我們把需要播放的音頻檔案"music.mp3"放到該目錄下。 然後修改java檔案中的代碼:
public class MultiMediaActivity extends AppCompatActivity { private MediaPlayer mediaPlayer = new MediaPlayer(); private Button mBtnPlay, mBtnPause, mBtnStop; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_multi_media); try { initMediaPlayer(); } catch (IOException e) { e.printStackTrace(); } mBtnPlay = findViewById(R.id.btn_Play); mBtnPause = findViewById(R.id.btn_Pause); mBtnStop = findViewById(R.id.btn_Stop); setListeners(); } private void setListeners() { OnClick onClick = new OnClick(); mBtnPlay.setOnClickListener(onClick); mBtnPause.setOnClickListener(onClick); mBtnStop.setOnClickListener(onClick); } private class OnClick implements View.OnClickListener { @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_Play: if (!mediaPlayer.isPlaying()) { mediaPlayer.start(); Toast.makeText(MultiMediaActivity.this, "開始為您播放音樂", Toast.LENGTH_SHORT).show(); } break; case R.id.btn_Pause: if (mediaPlayer.isPlaying()) { mediaPlayer.pause(); Toast.makeText(MultiMediaActivity.this, "已為您暫停播放目前音樂", Toast.LENGTH_SHORT).show(); } else { mediaPlayer.start(); Toast.makeText(MultiMediaActivity.this, "繼續為您播放音樂", Toast.LENGTH_SHORT).show(); } break; case R.id.btn_Stop: if (mediaPlayer.isPlaying()) { mediaPlayer.reset(); Toast.makeText(MultiMediaActivity.this, "已停止播放目前音樂", Toast.LENGTH_SHORT).show(); try { initMediaPlayer(); } catch (IOException e) { e.printStackTrace(); } break; } } } } public void initMediaPlayer() throws IOException { AssetManager manager = getAssets(); AssetFileDescriptor assetFileDescriptor = manager.openFd("music.mp3"); mediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(), assetFileDescriptor.getLength()); mediaPlayer.prepare(); } @Override protected void onDestroy() { super.onDestroy(); mediaPlayer.stop(); mediaPlayer.release(); }}
代碼中能夠看到,我們先建立了一個MediaPlayer對象,并把三個用于播放、暫停、停止音頻的Button控件聲明并找到了 。并在onCreate( )方法中調用initMediaPlayer( )方法,在這個方法中首先通過getAssets( )方法擷取一個AssetManager執行個體,AssetManager可以用于讀取assets目錄下的任何資源。接着我們調用openFd( )方法将音頻檔案找到并打開,最後依次調用setDataSource( )和prepare( )方法,為MediaPlayer做好播放前準備。再給用于控制音頻播放的三個按鈕設定點選事件,在播放按鈕的點選事件中通過isPlaying( )方法判斷音頻是否為播放狀态,如果為非播放狀态,就調用start( )方法播放音頻。在暫停按鈕的點選事件中判斷音頻是否為播放狀态(同樣是使用isPlaying( )),如果為播放狀态,就調用.pause( )方法暫停播放音頻,最後在結束播放按鈕的點選事件中通過isPlaying判斷,若為播放狀态,調用,reset( )将MediaPlayer對象重置為剛建立的狀态後,并再次調用initMediaPlayer( )方法。onDestroy( )方法中我們還需要調用stop( )和release( )方法将MediaPlayer相關的資源釋放。 現在我們就可以運作程式,來使用我們的應用程式來進行音頻的播放控制,點選播放按鈕,就可以開始音頻的播放;點選暫停按鈕,即暫停播放,再次點選暫停按鈕,即可繼續播放;點選結束按鈕,結束播放并重置播放器,