Android開發---MediaPlayer簡單音樂播放器
功能介紹
-
實現一個簡單的播放器,類似網易雲音樂形式,功能包括:
- 播放、暫停,停止,退出功能;
- 後臺播放功能;
- 進度條顯示播放進度、拖動進度條改變進度功能;
- 播放時圖片旋轉,顯示當前播放時間功能;
-
介面樣式
功能實現
1. MediaPlayer的實現
- MediaPlayer常用方法介紹
-
MediaPlayer的實現包括初始化MediaPlayer,MediaPlayer的功能實現,包括播放、暫停、停止、離開等,具體細節如下:
MediaPlayer的初始化包括讀取一個MP3格式的音樂檔案並設定其為迴圈播放:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
播放/暫停功能的實現放在Play/Pause按鈕中,所以需要二選一判斷MediaPlayer的狀態來設定音樂的播放與暫停:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
類似的,停止功能的實現放在Stop按鈕中,用於停止音樂並將其置於初始態即“00:00”:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
說明:由於呼叫stop()後,有時音樂並沒有馬上停止,所以我額外加了一個pause()來確保音樂停止播放。
同樣,離開功能實現放在了Quit按鈕中,主要實現整個應用的退出,具體應包括解綁Service,結束Activity等等:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
2. Service的應用
- Service即“服務” ,它與Activity屬於同一等級的應用程式元件,都代表可執行的程式。不同的是Activity擁有前臺執行的使用者介面,而Service不能自己執行,需要通過某個Activity或者其他Context物件來呼叫。Service在後臺執行,它不能與使用者直接進行互動。在預設情況下,Service執行在應用程式程序的主執行緒之中。可以通過Context.startService()和Context.bindService()兩種方式來啟動Service。
- 通過Service可以使程式在退出之後仍然能夠對事件或使用者操作做出反應,或者在後臺繼續執行某些程式功能。
- Android賦予Services比處於不活動(inactivity)的Activities更高的優先順序,所以它們的程序不會輕易被系統殺掉。
- Activity與Service的互動示意圖為:
有了以上知識的積累,基本可以實現Service的必要部分,如下:
1.新建一個繼承於Service的MusicService類
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
2.並在Activity中繫結MusicService:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
3. Handler更新UI介面
通過Handler來管理UI,最要需要用到post和postDelayed兩個函式:
1. post(Runnable r)
將r加入到訊息佇列中(其實就是利用UI主執行緒執行一段程式碼,這樣可以隨時在其他執行緒中調整控制元件)
2. postDelayed(Runnabled r,long delayMillis)
將r加入到訊息佇列中,並在指定時間之後觸發(單位為毫秒)
所以,為了實現音樂的播放顯示等功能,需要重寫Runnable的run函式,具體實現如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
4. 實現圖片的旋轉
圖片的動畫效果實現需要用到ObjectAnimator類,ObjectAnimator類可用於圖片的平移、旋轉、縮放等動畫,此處我們只需要用到其旋轉功能,具體實現如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
說明:animator是ObjectAnimator的一個例項物件,setDuration為5000表示旋轉一週需要的時間為5000,所以可用來設定旋轉的速度;同時設定為無線迴圈模式,並且新增一個插值器達到勻速旋轉的目的,最後呼叫pause()等函式動態控制動畫狀態,如下:
5. 進度條SeekBar功能實現
SeekBar的功能包括顯示歌曲播放進度以及拖動SeekBar至任意位置來改變播放進度,由於Android已經封裝好了這些函式,所以直接呼叫就好了,也比較好理解,具體實現如下:
- 1
- 2
- 3
- 1
- 2
- 3
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
6. 動態許可權申請
7. 判斷程式是否處於後臺
由於音樂需要支援後臺播放,再次由後臺進入前臺會對前臺的事件功能等產生影響,所以可以新增一個後臺判斷函式,並新增一個標誌來記錄應用是否進入後臺。