Android实战 – 音心播放器 (MusciActivity-专辑图片获得,基本控制实现)

最后更新于:2022-04-01 10:52:52

### 1.背景 上篇已经实现通过使用官方SDK进行基本数据请求再次封装的实现,这篇将实现对音乐的控制 播放、暂停、上一曲、下一曲的控制。 播放页面控制歌曲 - > 通知栏做出更改;通知栏控制歌曲-> 播放页面做出更改; ### 2.获得专辑图片思路总结 如果没有使用ShowApi上的接口就跳过这里吧;  (1)分析 在第一篇中我们已经知道歌曲列表中没有歌曲图片,但是提供的通过歌曲名或歌手名搜索歌曲接口,提供了歌手或者歌曲的图片,我们可以通过使用这个来进行使用获得当前播放歌曲的图片信息,从而给歌曲信息中加载出来。 (2)基本流程 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-19_5715764da3c55.jpg) (3)说明 通过上面的已经知道使用的是官方SDK提供的接口实现,基本步骤如上图所示,加载图片使用的是Volley网络请求框架,进行加载专辑图片。  [Android-Volley网络通信框架(二次封装数据请求和图片请求(包括处理请求队列和图片缓存))](http://blog.csdn.net/LABLENET/article/details/47859613)   ### 3.基本控制 (1)先来个基本的控制图解 从图上可以看出三个MusicNotification , MusicService , MusicActivity 三个过程,以MusicService为核心,MusicNotification和MusicActivity 相互控制实现; 如下图所示 ([点击查看原图](http://img.blog.csdn.net/20151216151717257)): ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-19_5715764dba587.jpg) (2)MusicActivity 播放与暂停 基本过程:当点击播放的时候,发送广播到MusicService ,MusicSrvice接受广播取得参数,对其进行控 制, 1)播放当前音乐 ;2)更新通知栏;3)发送广播给MusicActivity,更新MusicActivity界面状态; (3)Notification 控制播放 (实际上和上面一样) 基本过程:当点击播放的时候,发送广播到MusicService ,MusicSrvice接受广播取得参数,对其进行控 制, 1)播放当前音乐 ;2)更新通知栏;3)发送广播给MusicActivity,更新MusicActivity界面状态;      ### 4.过程实现 过程 : MusicActivity 初始化操作 、基本播放,暂停,下一曲,上一曲控制操作,均一样; (1)OnStart() 是发送广播给MusicService ~~~ @Override protected void onStart() { initData(); try { serviceIntent.putExtra(MUSIC_ACTIVITY_SERVICE_KEY, 40001); sendBroadcast(serviceIntent); } catch (Exception e) { showToast("new Intent 异常 : " + e.getMessage()); } super.onStart(); } ~~~ (2)MusicService 将 当前音乐数据信息,进度,发送给MusicActivity ~~~ /** * 来自 MusicActivity 的控制 * * @param musictype2 */ private void musicActivityService(int musictype2) { // showToast("musicActivityService 执行了 musictype2 :" + musictype2); switch (musictype2) { case 40001: sendModelToMusicActivity(); break; case 40002: //播放与暂停 playSong(); break; case 40003: //下一曲 nextSong(); break; case 40004: //上一曲 preSong(); break; } } ~~~ ~~~ /** * 发送Model给MusicActivity */ private void sendModelToMusicActivity() { if (mm != null) { // 正在播放的歌曲实体 if(mm.getSeconds()==0){ mm.setSeconds(mp.getDuration()/1000); } mActivityIntent.putExtra(MUSIC_SERVICE_TOACTIVITY_CODE, 41002); mActivityIntent.putExtra(MUSIC_SERVICE_TO_ACTIVITY_ISPLAY, mp.isPlaying()); mActivityIntent.putExtra(MUSIC_SERVICE_TO_ACTIVITY_NOWTIME, mp.getDuration() - mp.getCurrentPosition()); mActivityIntent.putExtra(MUSIC_SERVICE_TO_ACTIVITY_MODEL, (Serializable) mm); } else { // 默认发送第一首歌信息 mm = musics.get(0); mActivityIntent.putExtra(MUSIC_SERVICE_TOACTIVITY_CODE, 41001); mActivityIntent.putExtra(MUSIC_SERVICE_TO_ACTIVITY_ISPLAY, mp.isPlaying()); mActivityIntent.putExtra(MUSIC_SERVICE_TO_ACTIVITY_MODEL, (Serializable) mm); } sendBroadcast(mActivityIntent); } ~~~ 重点 : 在进行播放时,在MeidaPlayer中的OnPrepered()事件方法中进行发送 给MusicActivity 信息: ~~~ @Override public void onPrepared(MediaPlayer mp) { // 准备加载的时候 resume(); sendModelToMusicActivity(); } ~~~      (3)MusicActivityBoradCast进行接收信息并进行更新操作 ~~~ @Override public void onReceive(Context context, Intent intent) { code = intent.getIntExtra(MUSIC_SERVICE_TOACTIVITY_CODE, 0); if (code > 0) { // MusicService 来的控制 musicServiceKong(code, intent); } Log.d("MaskMusic", "MusicActivity - code : " + code); // 隐藏进度条 music_show_gone.setVisibility(View.GONE); } ~~~ ### 5.总结 在实现中,最纠结的就是在播放的时候,通知栏进行控制的时候,无法发送当前歌曲信息给MusicActivity, 后在onPrepered() 方法中尝试后,十分方便的使用; 下篇,歌词实现,滚动歌词;
';