All Projects → KunMinX → Jetpack Musicplayer

KunMinX / Jetpack Musicplayer

即使不用云音乐听曲儿,也请务必收藏好该库!🔥 一行代码即可接入,音乐播放控制组件 - Even if you don't listen to the music by Spotify, be sure to collect this library, please! 🔥 This music player component can be accessed by only one line of code. Supporting by LiveData & AndroidX.

Programming Languages

java
68154 projects - #9 most used programming language

Projects that are alternatives of or similar to Jetpack Musicplayer

Starrysky
🔥A Powerful and Streamline MusicLibrary(一个丰富的音乐播放封装库,支持多种音频格式,完美解决你的问题。)
Stars: ✭ 1,022 (+77.12%)
Mutual labels:  music, music-player, music-library, musicplayer
Musicbox
😊 🎵 MusicPlayer 一站式收听多平台音乐(网易云, 虾米, QQ)的跨平台音乐播放器,尽情享受吧~✨
Stars: ✭ 1,130 (+95.84%)
Mutual labels:  music, music-player, musicplayer
Quodlibet
Music player and music library manager for Linux, Windows, and macOS
Stars: ✭ 918 (+59.1%)
Mutual labels:  music, music-player, music-library
Guayadeque
Guayadeque is a music management program designed for all music enthusiasts. It is Full Featured Linux media player that can easily manage large collections and uses the Gstreamer media framework.
Stars: ✭ 87 (-84.92%)
Mutual labels:  music, music-player, music-library
Pandoraplayer
🅿️ PandoraPlayer is a lightweight music player for iOS, based on AudioKit and completely written in Swift.
Stars: ✭ 1,037 (+79.72%)
Mutual labels:  music, music-player, media
Jetpack Mvvm Best Practice
是 难得一见 的 Jetpack MVVM 最佳实践!在 以简驭繁 的代码中,对 视图控制器 乃至 标准化开发模式 形成正确、深入的理解!
Stars: ✭ 6,950 (+1104.51%)
Mutual labels:  music, music-player, livedata
Webaudiofont
Use full GM set of musical instruments to play MIDI and single sounds or effects. Support for reverberation and equaliser. No plugins, no Flash. Pure HTML5 implementation compatible with desktop and mobile browser. See live examples.
Stars: ✭ 600 (+3.99%)
Mutual labels:  music, music-player, music-composition
Simple Netease Cloud Music
🎵A simple netease music api lib. 简单、统一、轻巧的 Node.js 版网易云音乐 API
Stars: ✭ 268 (-53.55%)
Mutual labels:  music, music-player, music-library
Beatplayer
Music Player
Stars: ✭ 117 (-79.72%)
Mutual labels:  music, music-player, livedata
Nicemusic
A Nice MusicPlayer Powered by StarrySky
Stars: ✭ 107 (-81.46%)
Mutual labels:  music, music-player, music-library
Musicott
JavaFX application that manages and plays music files.
Stars: ✭ 97 (-83.19%)
Mutual labels:  music, music-player, music-library
Tauonmusicbox
The Linux desktop music player from the future! 🌆
Stars: ✭ 494 (-14.38%)
Mutual labels:  music, music-player, music-library
Hyperamp
🎛 Humble music player
Stars: ✭ 293 (-49.22%)
Mutual labels:  music, music-player, music-library
Diffuse
A music player that connects to your cloud/distributed storage.
Stars: ✭ 517 (-10.4%)
Mutual labels:  music, music-player, music-library
Powertabeditor
A cross-platform guitar tablature editor.
Stars: ✭ 334 (-42.11%)
Mutual labels:  music, music-composition
Lms
Lightweight Music Server. Access your self-hosted music using a web interface.
Stars: ✭ 315 (-45.41%)
Mutual labels:  music, music-player
Homehost
self-hosted, Netflix-like app made for streaming
Stars: ✭ 564 (-2.25%)
Mutual labels:  music, media
Canaree Music Player
Complete music player published in the Play Store. Heavily relies on Dagger, kotlin coroutines and Clean architecture.
Stars: ✭ 371 (-35.7%)
Mutual labels:  music, music-player
Jockey
A music player for Android focused on simplicity, performance, and design
Stars: ✭ 300 (-48.01%)
Mutual labels:  music, music-player
Music Player
From UI Proposal to Code 🎶▶️
Stars: ✭ 3,459 (+499.48%)
Mutual labels:  music, music-player

真香警告:即使不用云音乐听曲儿,也请务必收藏好该库!

Here is the English guide

 

⚠️ 提示:本库的存在主要是为了提供 基于设计模式和 LiveData 实现的 软件工程安全的 音乐播放器的示例,欢迎就库中的封装思想学习和参考。 考虑到库中使用的是原生的 MediaPlayer,存在不可预期的兼容性问题,请勿用于生产环境。

公告:

刚刚就本项目 "被卖课" 一事,在掘金发表了一期专访 《开源项目被人拿去做课程卖了 1000 多万是什么体验》

本项目系我为了方便开发者们 无痛理解 Google 开源的 Jetpack MVVM 中每个架构组件的 存在缘由、职责边界,而 精心设计的一个又一个高频应用场景

与此同时,本项目是作为《重学安卓》专栏 Jetpack MVVM 系列文章的配套项目而存在,文章内容和项目中的代码设计均涉及本人对 Jetpack MVVM 的独家理解,本人对此享有著作权

任何组织或个人,未经与作者本人沟通,不得将本项目的代码设计和本人对 Jetpack MVVM 的独家理解用于出书和卖课的商业用途。

由来

Jetpack-MusicPlayer 是一款基于 Jetpack MVVM 架构开发的 音乐播放控制组件,它是因 “Jetpack-MVVM-Best-Practice” 这个项目的需求而存在。

在最初寻遍了 GitHub 也没有找到合适的开源库(高度解耦、可远程依赖)之后,我决心研究参考现有开源项目关于 多媒体播放控制 的逻辑,并自己动手编写一个 高度解耦、轻松配置、可通过 Maven 仓库远程依赖 的真正的第三方库。

Jetpack-MusicPlayer 的使用十分简单,依托于 设计模式原则 及 JAVA 泛型特性,使用者无需知道内部的实现细节,仅通过继承 Album、Music、Artist 基类 即可完成 业务实体类 的定制和扩展

此外,在不设置自定义配置的情况下,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,绝不使用奇技淫巧、编写艰深晦涩的代码。

 

如果你正在思考 如何为项目挑选合适的架构 的话,这个项目值得你参考!

 

Download

google-play1.png coolapk1.png

 

简单使用:

1.在 build.gradle 中添加对该库的依赖。

implementation 'com.kunminx.player:player:1.1.6'

2.依据默认的专辑实体类 DefaultAlbum 的结构准备一串数据。

// DefaultAlbum 包含 DefaultMusic 和 DefaultArtist 两个子类:
// 三者的字段可详见 BaseAlbumItem、BaseMusicItem 和 BaseArtistItem。
//创建专辑实例
DefaultAlbum album = new DefaultAlbum("001", "Cute", "BenSound");

//为专辑添加作者
List<DefaultArtist> artists = new ArrayList<>();
artists.addArtists(new DefaultArtist("Linda"));
album.setArtist(artists);

//为专辑添加封面
album.setCoverImg("https://images.io/055ef18.png");

//创建音乐实例
List<DefaultMusic> musics = new ArrayList<>();

DefaultMusic music = new DefaultMusic("001", "Tomorrow", artists);
music.setCoverImg("https://images.io/055ef19.png");
music.setUrl("https://bensound.com/sunny.mp3");
musics.add(music);

DefaultMusic music1 = new DefaultMusic("002", "Sunny", artists);
music1.setCoverImg("https://images.io/055ef20.png");
music1.setUrl("https://bensound.com/cute.mp3");
musics.add(music1);

//将音乐添加到专辑
album.setMusics(musics);

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

DefaultPlayerManager.getInstance().init(this);

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

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

5.在视图控制器中 发送改变播放状态的请求,并接收来自 唯一可信源 统一分发的结果响应。

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

DefaultPlayerManager.getInstance().playNext();

5.2.在 订阅了对应状态通知 的 视图控制器 中,收听来自 唯一可信源 推送的结果响应。

5.2.1.例如 此处响应了 播放按钮状态 的推送

DefaultPlayerManager.getInstance().pauseLiveData().observe(this, aBoolean -> {
    mPlayerViewModel.isPlaying.set(!aBoolean);
});

5.2.2.例如 此处响应了 当前歌曲详细信息 的推送

DefaultPlayerManager.getInstance().changeMusicLiveData().observe(this, changeMusic -> {
    mPlayerViewModel.title.set(changeMusic.getTitle());
    mPlayerViewModel.artist.set(changeMusic.getSummary());
    mPlayerViewModel.coverImg.set(changeMusic.getImg());
});

5.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.** {*;}

 

个性化配置:

该库为 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 本类到项目中、只修改作为泛型的那几个实体类。

}

 

Thanks to

material-components-android

AndroidX

HDMediaPlayer

AndroidVideoCache

 

My Pages

Email:[email protected]

Home:KunMinX 的个人博客

Juejin:KunMinX 在掘金

《重学安卓》 专栏

付费读者加微信进群:myatejx

重学安卓小专栏

 

License

Copyright 2018-2020 KunMinX

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].