Skip to content

使用说明

KunMinX edited this page Jun 13, 2023 · 8 revisions

简单使用:

1.初始化装载数据

1.在 build.gradle 中添加依赖。

implementation 'com.kunminx.player:player:4.1.0'

提示:本库托管于 Maven Central,请自行在根目录 build.gradle 添加 mavenCentral()

2.依据默认专辑实体类 DefaultAlbum 结构准备一串数据。此处以 JSON 为例:

// DefaultAlbum 包含 DefaultMusic 和 DefaultArtist 两个子类:
// 三者的字段可详见 BaseAlbumItem、BaseMusicItem 和 BaseArtistItem。
{
  "albumId": "JAY_008",
  "title": "依然范特西",
  "summary": "Still Fantasy",
  "artist": {
    "name": "Jay"
  },
  "coverImg": "https://...57036-570ed96eb055ef17.png",
  "musics": [
    {
      "musicId": "JAY_008_001",
      "title": "本草纲目",
      "artist": {
        "name": "Jay"
      },
      "coverImg": "https://.../57036-570ed96eb055ef17.png",
      "url": "bencaogangmu.mp3"
    },
    ...
  ]
}

3.在 Application 中初始化 多媒体播放控制组件。

DefaultPlayerManager.getInstance().init(this);

4.在得到数据后,最少只需一行代码 即可完成数据的装载。

//一行代码完成数据的初始化。
DefaultPlayerManager.getInstance().loadAlbum(album);

温馨提示:

1.实际开发中,项目数据或与本库数据 “结构上存在差异”,故通常做法是,从后端拿到和解析项目 JSON 数据,并对该数据进行遍历。在遍历过程中,实例化并装载 “本库实体类对象” 到列表中,以获本库所能使用的列表数据。(具体可参见 CustomJsonSampleFragment 示例)

2.注意:如后端直接使用本库实体类读写 JSON 数据,请在 ProGuard Rules 中为该实体类配置混淆白名单:

-keep class com.kunminx.player.bean.** {*;}

2.播放控制

5.在 “视图控制器” 中发送请求,并接收来自 Dispatcher 统一分发结果响应。

5.1.在 “视图控制器” 任意处发送请求,例如此处请求 “播放下一首”

DefaultPlayerManager.getInstance().playNext();

5.2.在 “视图控制器” 订阅通知处,收听来自 Dispatcher 推送结果响应。

PlayerManager.getInstance().getDispatcher().output(this, playerEvent -> {
  switch (playerEvent.eventId) {
    case PlayerEvent.EVENT_CHANGE_MUSIC:
      mStates.title.set(playerEvent.changeMusic.getTitle());
      mStates.artist.set(playerEvent.changeMusic.getSummary());
      mStates.coverImg.set(playerEvent.changeMusic.getImg());
      break;
    case PlayerEvent.EVENT_PROGRESS:
      mStates.maxSeekDuration.set(playerEvent.playingMusic.getDuration());
      mStates.currentSeekPosition.set(playerEvent.playingMusic.getPlayerPosition());
      break;
    case PlayerEvent.EVENT_PLAY_STATUS:
      mStates.isPlaying.set(!playerEvent.toPause);
      break;
    case PlayerEvent.EVENT_REPEAT_MODE:
      Enum<PlayingInfoManager.RepeatMode> mode = playerEvent.repeatMode;
      mStates.playModeIcon.set(PlayerManager.getInstance().getModeIcon(mode));
      break;
  }
});

注意:如使用 JSON,请在 ProGuard Rules 中为该实体类目录配置混淆白名单:

-keep class com.kunminx.player.bean.** {*;}

3.个性化配置:

该库为 Album、Music、Artist 分别准备了基础实体类,定制实体类时,即是去继承、拓展 并取代 这些实体类。

关于个性化配置,具体可以参考我在 TestAlbumPlayerManagerPlayerFragment 等类中编写的案例:

Step1:根据需求扩展实体类

你需要根据需求,在 BaseAlbumItem 等实体类的基础上进行扩展,具体的办法是,编写一个实体类,该实体类须继承于 BaseAlbumItem;该实体类中的两个内部类也须分别继承于 BaseMusicItemBaseArtistItem

以 TestAlbum 实体类为例,扩充 albumMid 三个字段:

public class TestAlbum extends BaseAlbumItem<TestAlbum.TestMusic, TestAlbum.TestArtist> {

    private String albumMid;

    public String getAlbumMid() { return albumMid; }

    public void setAlbumMid(String albumMid) { this.albumMid = albumMid; }

    public static class TestMusic extends BaseMusicItem<TestArtist> {

        private String songMid;

        public String getSongMid() { return songMid; }

        public void setSongMid(String songMid) { this.songMid = songMid; }
    }

    public static class TestArtist extends BaseArtistItem {

        private String birthday;

        public String getBirthday() { return birthday; }

        public void setBirthday(String birthday) { this.birthday = birthday; }
    }
}

注意:如使用 JSON,请在 ProGuard Rules 中为该实体类配置混淆白名单。

 

Step2:实现接口,完成自定义配置

在装载数据和实现自定义配置时,泛型框中须指明你编写的实体类。

具体可参考 PlayerManager 类,该单例的存在就是为了指定你自己定义的实体类,否则你大可直接使用 DefaultPlayerManager

public class PlayerManager implements IPlayController<TestAlbum, TestAlbum.TestMusic> {

    private static PlayerManager sManager = new PlayerManager();

    private PlayerController<TestAlbum, TestAlbum.TestMusic> mController;

    private Context mContext;

    private PlayerManager() {
        mController = new PlayerController<>();
    }

    public static PlayerManager getInstance() {
        return sManager;
    }

    @Override
    public void init(Context context) {
        mContext = context.getApplicationContext();
        mController.init(mContext);
    }

    @Override
    public void loadAlbum(TestAlbum musicAlbum) {
        mController.loadAlbum(mContext, musicAlbum);
    }

    ...

    //事实上,大可直接 Copy 本类到项目中、只修改作为泛型的那几个实体类。

}