很高興見到你!java
Jetpack-MusicPlayer 是一款基於 Jetpack MVVM 架構開發的 音樂播放控制組件,它是因 「Jetpack-MVVM-Best-Practice」 這個項目的需求而存在。git
在最初尋遍了 GitHub 也沒有找到合適的開源庫(高度解耦、可遠程依賴)以後,我決心研究參考現有開源項目關於 多媒體播放控制 的邏輯,並本身動手編寫一個 高度解耦、輕鬆配置、可經過 Maven 倉庫遠程依賴 的真正的第三方庫。github
Jetpack-MusicPlayer 的使用十分簡單,依託於 設計模式原則 及 JAVA 泛型特性,使用者無需知道內部的實現細節,僅經過繼承 Album、Music、Artist 基類 便可完成 業務實體類 的定製和擴展。json
此外,在不設置自定義配置的狀況下,Jetpack-MusicPlayer 最少只需 一行代碼便可運行起來。設計模式
PureMusic | LiveData Dispatch | PlayMode Switch |
---|---|---|
Jetpack-MusicPlayer 的目標是:一行代碼便可接入 音樂播放控制組件。安全
除了一鍵接入而省去 99% 沒必要要的、複雜的、重複的工做外,你還能夠從這個開源項目得到的內容包括:架構
若是你正在思考 如何爲項目挑選合適的架構 的話,這個項目值得你參考!佈局
1.在 build.gradle 中添加對該庫的依賴。post
implementation 'com.kunminx.player:player:1.1.6'
複製代碼
2.依據默認的專輯實體類 DefaultAlbum
的結構準備一串數據(如下以 JSON 爲例)。gradle
// DefaultAlbum 包含 DefaultMusic 和 DefaultArtist 兩個子類:
// 三者的字段可詳見 BaseAlbumItem、BaseMusicItem 和 BaseArtistItem。
複製代碼
{
"albumId": "001",
"title": "Cute",
"summary": "BenSound",
"artist": {
"name": "Linda"
},
"coverImg": "https://images.io/055ef18.png",
"musics": [
{
"musicId": "001",
"title": "Tomorrow",
"artist": {
"name": "Mike"
},
"coverImg": "https://images.io/055ef19.png",
"url": "https://bensound.com/sunny.mp3"
},
{
"musicId": "002",
"title": "Sunny",
"artist": {
"name": "Jackson"
},
"coverImg": "https://images.io/055ef20.png",
"url": "https://bensound.com/cute.mp3"
}
]
}
複製代碼
3.在 Application 中初始化 多媒體播放控制組件。
DefaultPlayerManager.getInstance().init(this);
複製代碼
4.在獲得數據後,最少只需一行代碼 便可完成數據的裝載。
DefaultAlbum album = gson.fromJson(...);
//一行代碼完成數據的初始化。
DefaultPlayerManager.getInstance().loadAlbum(album);
複製代碼
5.在視圖控制器中 發送改變播放狀態的請求,並接收來自 惟一可信源 統一分發的結果響應。
// 1.在 任一視圖控制器 的 任一處 發送請求
// 1.1.例如 此處請求了 播放下一首
DefaultPlayerManager.getInstance().playNext();
複製代碼
// 2.在 訂閱了對應狀態通知 的 視圖控制器 中,收聽來自 惟一可信源 推送的結果響應。
// 2.1.例如 此處響應了 播放按鈕狀態 的推送
DefaultPlayerManager.getInstance().pauseLiveData().observe(this, aBoolean -> {
mPlayerViewModel.isPlaying.set(!aBoolean);
});
// 2.2.例如 此處響應了 當前歌曲詳細信息 的推送
DefaultPlayerManager.getInstance().changeMusicLiveData().observe(this, changeMusic -> {
mPlayerViewModel.title.set(changeMusic.getTitle());
mPlayerViewModel.artist.set(changeMusic.getSummary());
mPlayerViewModel.coverImg.set(changeMusic.getImg());
});
// 2.3.例如 此處響應了 當前歌曲播放進度 的推送
DefaultPlayerManager.getInstance().playingMusicLiveData().observe(this, playingMusic -> {
mPlayerViewModel.maxSeekDuration.set(playingMusic.getDuration());
mPlayerViewModel.currentSeekPosition.set(playingMusic.getPlayerPosition());
});
複製代碼
注意:如使用 JSON,請在 ProGuard Rules 中爲該實體類目錄配置混淆白名單:
-keep class com.kunminx.player.bean.** {*;}
複製代碼