要求:
实现上一首、播放/暂停、停止、下一首的功能,同时显示播放歌曲的简单信息。
实现界面展示
按下 下一首
核心代码
MusicService.java
public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
int control = intent.getIntExtra("control",-1);
switch (control)
{
//播放或暂停
case 1:
//原来处于没有播放状态
if(status == 0x11)
{
// 准备 并播放 音乐
prepareAndPlay(musics[current]);
status = 0x12;
}
//原来处于播放状态
else if (status == 0x12)
{
//暂停
mediaPlayer.pause();
//改为暂停状态
status = 0x13;
}
// 原来 处于 暂停状态
else if (status == 0x13)
{
//播放
mediaPlayer.start();
// 改变状态
status = 0x12;
}
break;
//停止 播放
case 2:
//如果原来正在播放或暂停
if (status == 0x12 || status == 0x13)
{
// 停止播放
mediaPlayer.stop();
status = 0x11;
}
break;
// 上一首
case 3:
if (status == 0x12 ||status == 0x13)
{
current = ((current - 1)+ musics.length) % musics.length;
prepareAndPlay(musics[current]);
status = 0x12;
}
break;
// 下一首
case 4:
if (status == 0x12 ||status == 0x13)
{
current = (current + 1) % musics.length;
prepareAndPlay(musics[current]);
status = 0x12;
}
break;
}
// 广播通知 Activity 更改图标、文本框
Intent sendIntent = new Intent(MainActivity.UPDATE_ACTION);
sendIntent.putExtra("update",status);
sendIntent.putExtra("current",current);
//发送广播,将被Activity组件中的BroadcastReceiver接收到
sendBroadcast(sendIntent);
}
}
private void prepareAndPlay(String music){
// 打开指定音乐文件
try {
AssetFileDescriptor afd = assetManager.openFd(music);
mediaPlayer.reset();
// 使用MediaPlayer加载指定的声音文件。
mediaPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
// 准备声音
mediaPlayer.prepare();
//播放
mediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
MainActivity.java
public class ActivityReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// 获取 Intent 中的update消息,update 代表播放状态
int update = intent.getIntExtra("update",-1);
// 获取 Intent 中的current消息,current代表当前正在播放的歌曲
int current = intent.getIntExtra("current",-1);
if(current >=0)
{
title.setText(titleStrs[current]);
author.setText(authorStrs[current]);
}
switch (update)
{
//没有 播放状态
case 0x11:
play.setImageResource(R.drawable.play);
status = 0x11;
title.setText("");
author.setText("");
break;
//控制系统进入 播放状态
case 0x12:
//播放状态下设置使用暂停图标
play.setImageResource(R.drawable.pause);
//设置当前状态
status = 0x12;
break;
//控制系统进入暂停状态
case 0x13:
//暂停状态下设置使用播放图标
play.setImageResource(R.drawable.play);
//设置当前状态
status = 0x13;
break;
}
}
}
@Override
public void onClick(View v) {
// 创建 Intent
Intent intent = new Intent("org.crazyit.action.CTL_ACTION");
switch (v.getId())
{
//按下播放/暂停按钮
case R.id.play:
intent.putExtra("control",1);
break;
// 按下 停止 按钮
case R.id.stop:
intent.putExtra("control",2);
break;
// 按下 上一首
case R.id.btnptrack:
intent.putExtra("control",3);
break;
// 按下 下一首
case R.id.btnntrack:
intent.putExtra("control",4);
break;
}
// 发送广播 , 将被Service 组件 中的BroadcastReceiver 接收到
sendBroadcast(intent);
}