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() 方法中尝试后,十分方便的使用;
下篇,歌词实现,滚动歌词;