开源库MusicPlayManager - 封装StarrySky音乐库
开源库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音乐库相关推荐
- 开源免费的C/C++网络库(c/c++ sockets library)
(1)ACE 庞大.复杂,适合大型项目.开源.免费,不依赖第三方库,支持跨平台. http://www.cs.wustl.edu/~schmidt/ACE.html (2)Asio Asio基于Boo ...
- Android直播开发之旅(4):MP3编码格式分析与lame库编译封装
转载请声明出处:http://blog.csdn.net/andrexpert/article/77683776 一.Mp3编码格式分析 MP3,全称MPEG Audio Layer3,是一种高效的计 ...
- ffmpeg开发之旅(4):MP3编码格式分析与lame库编译封装
ffmpeg开发之旅(4):MP3编码格式分析与lame库编译封装 原文链接:http://blog.csdn.net/andrexpert/article/77683776 一.Mp3编码格式分析 ...
- Android图片加载库的封装实战
重磅更新 2017-02-16 2017-05-09 优化圆形图片加载 更新demo 前言 主流图片加载库的对比 Android-Universal-Image-Loader Picasso Glid ...
- spdlog日志库的封装使用
文章目录 前言 spdlog的基本使用 spdlog日志库的封装 前言 编码过程中,日志是必要的一个组件,我们选择使用哪个日志库呢? 参考:15 best C++ Logging libraries ...
- libslog---高性能开源C/C++多线程安全日志库
Fromwiki: https://code.google.com/p/easynetwork/wiki/libslog libslog是一个基于linux的高性能开源C/C++多线程安全日志库.Ea ...
- linux封装函数,libc库和封装函数 | 求索阁
Linux系统调用这部分经常出现两个词:libc库和封装函数,不知道你是否清楚它们的含义? libc 1)libc概念 libc是Stantard C Library的简称,它是符合ANSI C标准的 ...
- C++将带ui界面的qt工程封装为动态库dll
C++将带ui界面的qt工程封装为动态库dll 功能如下 完整源代码实现如下 功能如下 将工程封装后可以在别的工程下直接引用该界面,以及该界面的函数, 完整源代码实现如下 #ifndef BUILD_ ...
- ios上传音频文件到服务器,IOS开发:iPod的音乐库中的音频如何上传到服务器中...
最近在做的项目里有一个功能,就是拿到手机媒体库中的音频文件,并实现APP中的播放,已经转成MP3格式上传到服务器上. 首先是要能获取到ipod library中的音频.这里我用的是MPMediaQue ...
最新文章
- 搞不懂为啥都要去字节跳动,进阿里不香吗?
- 日本人真会玩!3天众筹60万元来造“机器猫”,会说话摇尾巴的那种
- Chrome 浏览器提示adobe flash player不是最新版本
- 执行AJAX返回HTML片段中的JavaScript脚本
- [转]如何处理机器学习中的不平衡类别
- shedlock 重启系统报错问题_关于国产湖南麒麟LINUX3.3系统兼容性问题
- Android 应用启动速度优化
- ppsspp模拟java按键_ppsspp 手柄按键映射 北通 BTP
- [Noip2007]Core树网的核
- 8路USB继电器模块 windows Linux使用
- Javaweb项目各个模块的用途
- Git GUI中文乱码解决问题
- 手把手教你运用JAVA爬虫技术爬取小说
- 【Milvus的以图搜图】
- 收发电子发票用什么邮箱?
- 如何将notepad++中的xml文件格式化(层级关系展示)
- 【全志T113-S3_100ask】15-1 内核5.4驱动spi屏幕——ILI9341
- aria2c rpc php,Mac上配置 aria2c 神器
- 【LeetCode】详解环形链表141. Linked List Cycle Given a linked list, determine if it has a cycle in it. To
- nRF52833及蓝牙5系列NRF52832低功耗蓝牙芯片对比
热门文章
- 支付宝小程序使用MQTT over WebSocket连接阿里云IoT物联网平台
- Google Earth Engine(GEE)——Landsat7条带去除两种方案
- php cmyk图片,php – 使用Imagick将图像从RGB转换为CMYK
- mysql中日期相减_Excel日期和时间运算
- html给div加圆角边框,border-radius是向元素添加圆角边框的方法
- 雨林木风 linux操作系统,“雨林木风”操作系统门户正式上线
- ThreadPoolTaskScheduler实现动态管理定时任务
- 如何挑选属于自己的电脑
- android华为获取相册,解决华为手机获取相册图片路径为null
- stl如果开o2_打开STL文件的四种最佳方法