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

1.背景

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

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


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

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

   (1)分析

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

    (2)基本流程

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

    (3)说明

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

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

 

3.基本控制

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

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

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

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


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

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


你可能感兴趣的:(android,实战,安卓实战音心APP开发)