开源库MusicPlayManager - 封装StarrySky音乐库

  • 关于
  • 效果图
  • 使用
    • Java版初始化
    • Kotlin版初始化
    • java版权限检查工具使用方法:
    • kotlin权限检查工具使用方法:
    • java使用打印日志
    • kotlin使用打印日志
    • java防恶意点击
    • kotlin防恶意点击
  • 使用
    • 还有好对方法,如设置音量大小、倍速、更新播放队列、开关通知栏、音效等等。
  • 目前存在问题

关于

  MusicPlayManager地址,这是我最近重构简易音乐的时候看了一下StarrySky的使用,19年还是00年那会就想着要基于StarrySky做一个单例一样的管理类,后面不了了之了,现在因为重构项目,想着可以基于StarrySky来做一个用户几乎不需要改动的封装,来实现自定义音乐通知栏、只需要输入一个target页面来接收页面跳转即可,用户可以在使用之前再进行初始化。
  仓库里面有简单的使用实例,支持java、kotlin。
  MusicPlayManager提供音乐播放封装、自定义通知栏及圆角、日志功能、权限申请、无入侵获取上下文以及防恶意点击等。

效果图

使用

  首先添加需要的权限:

 <uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.RECORD_AUDIO" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"tools:ignore="ScopedStorage" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

  添加引用:
    工程build添加如下:

repositories {maven { url 'https://jitpack.io' }}

    项目的build里添加如下

implementation 'com.github.Tobeyr1:MusicPlayManager:1.0.2'

Java版初始化

private final String[] APP_PERMISSIONS = new ArrayList<String>(){{add(Manifest.permission.WRITE_EXTERNAL_STORAGE);add(Manifest.permission.READ_EXTERNAL_STORAGE);add(Manifest.permission.RECORD_AUDIO);add(Manifest.permission.READ_PHONE_STATE);}}.toArray(new String[0]);@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_java);checks = new PermissionChecks(this);} checks.requestPermissions(APP_PERMISSIONS, it ->{if (it){//  MusicPlay.initConfig(this,new PlayConfig());}else {}return null;});

Kotlin版初始化

private var checks: PermissionChecks? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)checks = PermissionChecks(this)checks!!.requestPermissions(arrayOf(Manifest.permission.READ_PHONE_STATE,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.RECORD_AUDIO)){if (it){MusicPlay.initConfig(this, PlayConfig(notificationClass = "com.tobery.app.JavaActivity" //设置target页面,defaultNotificationConfig = MusicNotificationConfig.create {targetClass { "com.tobery.musicplay.NotificationReceiver" }targetClassBundle {val bundle = Bundle()bundle.putString("title", "我是点击通知栏转跳带的参数")bundle.putString("targetClass", "com.tobery.app.JavaActivity")return@targetClassBundle bundle}smallIconRes { //自定义通知栏小图标R.drawable.ic_music_cover}}))}}}

java版权限检查工具使用方法:

private final String[] APP_PERMISSIONS = new ArrayList<String>(){{add(Manifest.permission.WRITE_EXTERNAL_STORAGE);add(Manifest.permission.READ_EXTERNAL_STORAGE);add(Manifest.permission.RECORD_AUDIO);add(Manifest.permission.READ_PHONE_STATE);}}.toArray(new String[0]);@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_java);//必须要在oncreate里面注册,否则会崩溃提示异常checks = new PermissionChecks(this);} //然后在需要使用的地方调用即可checks.requestPermissions(APP_PERMISSIONS, it ->{if (it){ //权限全部通过}else {}return null;});//调用单个权限检查checks.requestPermission(Manifest.permission.READ_PHONE_STATE,it ->{return null;});

kotlin权限检查工具使用方法:

private var checks: PermissionChecks? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)//必须要在oncreate里面注册,否则会崩溃提示异常checks = PermissionChecks(this)//调用单个权限检查checks!!.requestPermission(Manifest.permission.READ_PHONE_STATE){if (it){}}checks!!.requestPermissions(arrayOf(Manifest.permission.READ_PHONE_STATE,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.RECORD_AUDIO)){if (it){//lambda表达式}}

java使用打印日志

//可以打印任何对象
ViewExtensionKt.printLog(playbackStage.getSongInfo().getSongUrl());

kotlin使用打印日志

"是否有下一首$hasNextSong".printLog()
xxx.printLog()

java防恶意点击

 ViewExtensionKt.setOnSingleClickListener(binding.btnPhoneLogin,view -> {Intent intent = new Intent(this, LoginActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);finish();});

kotlin防恶意点击

binding.btGetGeneralSetting.setOnSingleClickListener {}

使用

MusicPlay.playMusicById() 通过songId播放
MusicPlay.playMusicByUrl() 通过歌曲url播放
MusicPlay.playMusicByInfo() 通过歌曲信息播放
MusicPlay.playMusicByList(songList,0) 播放歌曲列表,并从指定下标开始
MusicPlay.pauseMusic() 暂停
MusicPlay.restoreMusic() 恢复播放
MusicPlay.setRepeatMode() 设置播放模式以及是否循环
MusicPlay.getRepeatMode() 获取当前播放模式
MusicPlay.skipToNext() 下一首
MusicPlay.skipToPrevious() 上一首
MusicPlay.stopMusic() 停止
MusicPlay.isPlaying() 是否播放中
MusicPlay.onPlayProgressListener() 进度监听
MusicPlay.onPlayStateListener() 状态监听
MusicPlay.isNetworkAvailable() 网络状态监听,基于生命周期
MusicPlay.networkGlobalAvailable() 网络状态全局监听
MusicPlay.seekTo() 跳至指定进度,并可以觉得是否播放
MusicPlay.addPlayList() 添加播放队列
MusicPlay.clearPlayList() 清空播放队列

还有好对方法,如设置音量大小、倍速、更新播放队列、开关通知栏、音效等等。

  例如下:

//网络状态监听MusicPlay.isNetworkAvailable(this,this, new OnNetWorkChangeListener() {@Overridepublic void onNetWorkChange(boolean isAvailable) {runOnUiThread(new Runnable() {@Overridepublic void run() {}});}});//网络全局监听MusicPlay.networkGlobalAvailable(new OnNetWorkChangeListener() {@Overridepublic void onNetWorkChange(boolean isAvailable) {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(JavaActivity.this,"当前网络是否可用"+isAvailable+"",Toast.LENGTH_SHORT).show();}});}});
MusicInfo songInfo = new MusicInfo();songInfo.setSongId("33894312");songInfo.setSongUrl("http://music.163.com/song/media/outer/url?id=33894312");songInfo.setArtist("歌手");songInfo.setSongName("海阔天空");songInfo.setSongCover("http://p3.music.126.net/Uyj-KRGb9ZnwuPLYEe739Q==/109951167614293336.jpg");songList.add(songInfo);MusicInfo songInfo1 = new MusicInfo();songInfo1.setSongId("1960605228");songInfo1.setSongUrl("http://music.163.com/song/media/outer/url?id=1960605228");songInfo1.setArtist("龚明威");songInfo1.setSongName("起风了");songInfo1.setSongCover("http://p3.music.126.net/EI-1VBiCIJ7lF9R7sxFNJA==/109951167611502432.jpg");songList.add(songInfo1);MusicInfo songInfo2 = new MusicInfo();songInfo2.setSongId("1960903012");songInfo2.setSongName("黑本子(Black Benz)");songInfo2.setSongUrl("http://music.163.com/song/media/outer/url?id=1960903012");songInfo2.setArtist("KEY.L刘聪");songInfo2.setSongCover("http://p4.music.126.net/yRqakJ-0o6ZN6T-CaU4XvA==/109951167619824931.jpg");songList.add(songInfo2);MusicInfo songInfo3 = new MusicInfo();songInfo3.setSongId("3727");songInfo3.setArtist("flc");songInfo3.setSongName("测试");songInfo3.setSongUrl("http://m8.music.126.net/20220706153844/41cc70c399540e0ff8cf639114e157ce/ymusic/9429/7fbc/3727/d0647c73bcc77006b94ce6ad9ae620f7.flac");songInfo3.setSongCover("http://p3.music.126.net/EI-1VBiCIJ7lF9R7sxFNJA==/109951167611502432.jpg");songList.add(songInfo3);MusicPlay.playMusicByList(songList,0);//播放状态监听MusicPlay.onPlayStateListener(this, new OnMusicPlayStateListener() {@Overridepublic void onPlayState(@NonNull PlayManger playbackStage) {switch (playbackStage.getStage()){case PlayManger.IDLE:ViewExtensionKt.printLog("空闲");break;case PlayManger.PLAYING:ViewExtensionKt.printLog("播放");break;case PlayManger.BUFFERING:ViewExtensionKt.printLog("缓冲");break;case PlayManger.PAUSE:ViewExtensionKt.printLog("暂停");break;case PlayManger.SWITCH:ViewExtensionKt.printLog("切歌"+playbackStage.getSongInfo().getSongUrl());ViewExtensionKt.printLog("上一首"+playbackStage.getLastSongInfo().getSongName());break;}}});MusicPlay.onPlayProgressListener( new OnMusicPlayProgressListener() {@Overridepublic void onPlayProgress(long currPos, long duration) {ViewExtensionKt.printLog("当前进度"+currPos);}});ViewExtensionKt.setOnSingleClickListener(findViewById(R.id.bt_two), view -> {//保存音效配置MusicPlay.saveEffectConfig(true);//开启音效MusicPlay.effectSwitch(true);//获取对应音效配置MusicPlay.attachAudioEffect(MusicPlay.getAudioSessionId());//获取均衡器支持的预设总数short numberOfPresets = MusicPlay.equalizerNumberOfPresets();//获取当前的预设Short currentPreset = MusicPlay.equalizerCurrentPreset();ViewExtensionKt.printLog("当前预设"+currentPreset);int preset = 0;ViewExtensionKt.printLog("预设数"+numberOfPresets);for(short var6 = numberOfPresets; preset < var6; ++preset) {String presetName = MusicPlay.equalizerPresetName((short)preset);ViewExtensionKt.printLog("预设内容"+MusicPlay.equalizerPresetName(presetName));}});

目前存在问题

  • 目前traget版本30 即Android11,因为Android12的行为变更暂未适配

开源库MusicPlayManager - 封装StarrySky音乐库相关推荐

  1. 开源免费的C/C++网络库(c/c++ sockets library)

    (1)ACE 庞大.复杂,适合大型项目.开源.免费,不依赖第三方库,支持跨平台. http://www.cs.wustl.edu/~schmidt/ACE.html (2)Asio Asio基于Boo ...

  2. Android直播开发之旅(4):MP3编码格式分析与lame库编译封装

    转载请声明出处:http://blog.csdn.net/andrexpert/article/77683776 一.Mp3编码格式分析 MP3,全称MPEG Audio Layer3,是一种高效的计 ...

  3. ffmpeg开发之旅(4):MP3编码格式分析与lame库编译封装

    ffmpeg开发之旅(4):MP3编码格式分析与lame库编译封装 原文链接:http://blog.csdn.net/andrexpert/article/77683776 一.Mp3编码格式分析 ...

  4. Android图片加载库的封装实战

    重磅更新 2017-02-16 2017-05-09 优化圆形图片加载 更新demo 前言 主流图片加载库的对比 Android-Universal-Image-Loader Picasso Glid ...

  5. spdlog日志库的封装使用

    文章目录 前言 spdlog的基本使用 spdlog日志库的封装 前言 编码过程中,日志是必要的一个组件,我们选择使用哪个日志库呢? 参考:15 best C++ Logging libraries ...

  6. libslog---高性能开源C/C++多线程安全日志库

    Fromwiki: https://code.google.com/p/easynetwork/wiki/libslog libslog是一个基于linux的高性能开源C/C++多线程安全日志库.Ea ...

  7. linux封装函数,libc库和封装函数 | 求索阁

    Linux系统调用这部分经常出现两个词:libc库和封装函数,不知道你是否清楚它们的含义? libc 1)libc概念 libc是Stantard C Library的简称,它是符合ANSI C标准的 ...

  8. C++将带ui界面的qt工程封装为动态库dll

    C++将带ui界面的qt工程封装为动态库dll 功能如下 完整源代码实现如下 功能如下 将工程封装后可以在别的工程下直接引用该界面,以及该界面的函数, 完整源代码实现如下 #ifndef BUILD_ ...

  9. ios上传音频文件到服务器,IOS开发:iPod的音乐库中的音频如何上传到服务器中...

    最近在做的项目里有一个功能,就是拿到手机媒体库中的音频文件,并实现APP中的播放,已经转成MP3格式上传到服务器上. 首先是要能获取到ipod library中的音频.这里我用的是MPMediaQue ...

最新文章

  1. 搞不懂为啥都要去字节跳动,进阿里不香吗?
  2. 日本人真会玩!3天众筹60万元来造“机器猫”,会说话摇尾巴的那种
  3. Chrome 浏览器提示adobe flash player不是最新版本
  4. 执行AJAX返回HTML片段中的JavaScript脚本
  5. [转]如何处理机器学习中的不平衡类别
  6. shedlock 重启系统报错问题_关于国产湖南麒麟LINUX3.3系统兼容性问题
  7. Android 应用启动速度优化
  8. ppsspp模拟java按键_ppsspp 手柄按键映射 北通 BTP
  9. [Noip2007]Core树网的核
  10. 8路USB继电器模块 windows Linux使用
  11. Javaweb项目各个模块的用途
  12. Git GUI中文乱码解决问题
  13. 手把手教你运用JAVA爬虫技术爬取小说
  14. 【Milvus的以图搜图】
  15. 收发电子发票用什么邮箱?
  16. 如何将notepad++中的xml文件格式化(层级关系展示)
  17. 【全志T113-S3_100ask】15-1 内核5.4驱动spi屏幕——ILI9341
  18. aria2c rpc php,Mac上配置 aria2c 神器
  19. 【LeetCode】详解环形链表141. Linked List Cycle Given a linked list, determine if it has a cycle in it. To
  20. nRF52833及蓝牙5系列NRF52832低功耗蓝牙芯片对比

热门文章

  1. 支付宝小程序使用MQTT over WebSocket连接阿里云IoT物联网平台
  2. Google Earth Engine(GEE)——Landsat7条带去除两种方案
  3. php cmyk图片,php – 使用Imagick将图像从RGB转换为CMYK
  4. mysql中日期相减_Excel日期和时间运算
  5. html给div加圆角边框,border-radius是向元素添加圆角边框的方法
  6. 雨林木风 linux操作系统,“雨林木风”操作系统门户正式上线
  7. ThreadPoolTaskScheduler实现动态管理定时任务
  8. 如何挑选属于自己的电脑
  9. android华为获取相册,解决华为手机获取相册图片路径为null
  10. stl如果开o2_打开STL文件的四种最佳方法