开源库MusicPlayManager - 封装StarrySky音乐库

关于

  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-permission
        android: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]);
    
     @Override
    protected 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? = null

override 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]);
    
     @Override
    protected 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? = null

override 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() {
            @Override
            public void onNetWorkChange(boolean isAvailable) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                    }
                });
            }
        });
        //网络全局监听
        MusicPlay.networkGlobalAvailable(new OnNetWorkChangeListener() {
            @Override
            public void onNetWorkChange(boolean isAvailable) {
                runOnUiThread(new Runnable() {
                    @Override
                    public 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() {

                @Override
                public 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() {
                @Override
                public 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的行为变更暂未适配
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当使用Java来实现一个星空程序时,你可以借助Java的图形来绘制星空效果。下面是一个简单的示例代码,展示了如何使用Java Swing来创建一个绘制星空的程序: ```java import javax.swing.*; import java.awt.*; public class StarrySky extends JFrame { private static final int WIDTH = 800; // 窗口宽度 private static final int HEIGHT = 600; // 窗口高度 private Star[] stars; // 星星数组 public StarrySky() { setTitle("Starry Sky"); setSize(WIDTH, HEIGHT); setDefaultCloseOperation(EXIT_ON_CLOSE); setResizable(false); // 初始化星星数组 stars = new Star[100]; for (int i = 0; i < stars.length; i++) { int x = (int) (Math.random() * WIDTH); int y = (int) (Math.random() * HEIGHT); int size = (int) (Math.random() * 5) + 1; int speed = (int) (Math.random() * 3) + 1; stars[i] = new Star(x, y, size, speed); } } @Override public void paint(Graphics g) { super.paint(g); // 绘制背景 g.setColor(Color.BLACK); g.fillRect(0, 0, WIDTH, HEIGHT); // 绘制星星 g.setColor(Color.WHITE); for (Star star : stars) { g.fillOval(star.getX(), star.getY(), star.getSize(), star.getSize()); } } public static void main(String[] args) { EventQueue.invokeLater(() -> { StarrySky starrySky = new StarrySky(); starrySky.setVisible(true); // 更新星星位置 while (true) { for (Star star : starrySky.stars) { star.updatePosition(); } starrySky.repaint(); try { Thread.sleep(30); } catch (InterruptedException e) { e.printStackTrace(); } } }); } } class Star { private int x; // x坐标 private int y; // y坐标 private int size; // 大小 private int speed; // 移动速度 public Star(int x, int y, int size, int speed) { this.x = x; this.y = y; this.size = size; this.speed = speed; } public int getX() { return x; } public int getY() { return y; } public int getSize() { return size; } public void updatePosition() { y += speed; if (y > StarrySky.HEIGHT) { // 如果超出窗口范围,则重新从顶部开始 y = 0; x = (int) (Math.random() * StarrySky.WIDTH); } } } ``` 这个程序使用Java的Swing创建了一个窗口,并通过继承JFrame类来实现。在窗口中绘制星空效果,首先初始化了一些随机位置和大小的星星对象,并在`paint`方法中使用`Graphics`对象绘制这些星星。然后,通过不断更新星星的位置和重绘窗口来实现星星的移动效果。 你可以将上述代码保存为`StarrySky.java`文件,并使用Java编译器进行编译,然后运行该程序,即可看到一个简单的星空效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪の星空朝酱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值