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

来源:互联网 发布:windows多线程编程视频 编辑:程序博客网 时间:2024/06/04 19:56

1.背景

     上篇已经实现通过使用官方SDK进行基本数据请求再次封装的实现,这篇将实现对音乐的控制 播放、暂停、上一曲、下一曲的控制。

     播放页面控制歌曲 - > 通知栏做出更改;通知栏控制歌曲-> 播放页面做出更改;


2.获得专辑图片思路总结

      如果没有使用ShowApi上的接口就跳过这里吧; 

   (1)分析

             在第一篇中我们已经知道歌曲列表中没有歌曲图片,但是提供的通过歌曲名或歌手名搜索歌曲接口,提供了歌手或者歌曲的图片,我们可以通过使用这个来进行使用获得当前播放歌曲的图片信息,从而给歌曲信息中加载出来。

    (2)基本流程

      

    (3)说明

            通过上面的已经知道使用的是官方SDK提供的接口实现,基本步骤如上图所示,加载图片使用的是Volley网络请求框架,进行加载专辑图片。

 Android-Volley网络通信框架(二次封装数据请求和图片请求(包括处理请求队列和图片缓存))

 

3.基本控制

   (1)先来个基本的控制图解

            从图上可以看出三个MusicNotification , MusicService , MusicActivity 三个过程,以MusicService为核心,MusicNotification和MusicActivity 相互控制实现;

            如下图所示 (点击查看原图):



       (2)MusicActivity 播放与暂停

                基本过程:当点击播放的时候,发送广播到MusicService ,MusicSrvice接受广播取得参数,对其进行控 制, 1)播放当前音乐 ;2)更新通知栏;3)发送广播给MusicActivity,更新MusicActivity界面状态;

                

       (3)Notification 控制播放 (实际上和上面一样)

                基本过程:当点击播放的时候,发送广播到MusicService ,MusicSrvice接受广播取得参数,对其进行控 制, 1)播放当前音乐 ;2)更新通知栏;3)发送广播给MusicActivity,更新MusicActivity界面状态;

    

4.过程实现

   过程 : MusicActivity 初始化操作 、基本播放,暂停,下一曲,上一曲控制操作,均一样;

    (1)OnStart() 是发送广播给MusicService

          

@Overrideprotected 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 信息:

@Overridepublic void onPrepared(MediaPlayer mp) {// 准备加载的时候resume();sendModelToMusicActivity();}


     (3)MusicActivityBoradCast进行接收信息并进行更新操作

@Overridepublic 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() 方法中尝试后,十分方便的使用;

     下篇,歌词实现,滚动歌词;


0 0
原创粉丝点击