真香警告:即便不用雲音樂聽曲兒,也請務必收藏好該庫!

很高興見到你!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
5.gif
4.gif
3.gif

目標

Jetpack-MusicPlayer 的目標是:一行代碼便可接入 音樂播放控制組件安全

除了一鍵接入而省去 99% 沒必要要的、複雜的、重複的工做外,你還能夠從這個開源項目得到的內容包括:架構

  1. 整潔的代碼風格 和 標準的資源命名規範。
  2. Jetpack MVVM 架構在 編寫第三方庫 中的最佳實踐:經過 LiveData 配合 做爲惟一可信源的單例 來完成 全應用範圍內 播放狀態的正確分發,以免 在軟件工程的背景下 滋生的各類 不可預期的錯誤
  3. 優秀的代碼分層和封裝思想,在不作任何個性化配置的狀況下,一行代碼便可接入。
  4. 主體工程基於前沿的、軟件工程安全的 JetPack MVVM 架構。
  5. AndroidX 和 Material Design 2 的全面使用。
  6. ConstraintLayout 約束佈局的最佳實踐。
  7. 毫不使用 Dagger,毫不使用奇技淫巧、編寫艱深晦澀的代碼。

若是你正在思考 如何爲項目挑選合適的架構 的話,這個項目值得你參考!佈局

簡單使用:

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.** {*;}
複製代碼

個性化配置:

詳見 GitHub: Jetpack-MusicPlayer

相關文章
相關標籤/搜索