Android应用开发--MP3音乐播放器Service实现

//服务要发送的一些Action

public static final String UPDATE_ACTION = “com.wwj.action.UPDATE_ACTION”; //更新动作

public static final String CTL_ACTION = “com.wwj.action.CTL_ACTION”; //控制动作

public static final String MUSIC_CURRENT = “com.wwj.action.MUSIC_CURRENT”; //当前音乐播放时间更新动作

public static final String MUSIC_DURATION = “com.wwj.action.MUSIC_DURATION”;//新音乐长度更新动作

/**

  • handler用来接收消息,来发送广播更新播放时间

*/

private Handler handler = new Handler() {

public void handleMessage(android.os.Message msg) {

if (msg.what == 1) {

if(mediaPlayer != null) {

currentTime = mediaPlayer.getCurrentPosition(); // 获取当前音乐播放的位置

Intent intent = new Intent();

intent.setAction(MUSIC_CURRENT);

intent.putExtra(“currentTime”, currentTime);

sendBroadcast(intent); // 给PlayerActivity发送广播

handler.sendEmptyMessageDelayed(1, 1000);

}

}

};

};

@Override

public void onCreate() {

super.onCreate();

Log.d(“service”, “service created”);

mediaPlayer = new MediaPlayer();

mp3Infos = MediaUtil.getMp3Infos(PlayerService.this);

/**

  • 设置音乐播放完成时的监听器

*/

mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

@Override

public void onCompletion(MediaPlayer mp) {

if (status == 1) { // 单曲循环

mediaPlayer.start();

} else if (status == 2) { // 全部循环

current++;

if(current > mp3Infos.size() - 1) { //变为第一首的位置继续播放

current = 0;

}

Intent sendIntent = new Intent(UPDATE_ACTION);

sendIntent.putExtra(“current”, current);

// 发送广播,将被Activity组件中的BroadcastReceiver接收到

sendBroadcast(sendIntent);

path = mp3Infos.get(current).getUrl();

play(0);

} else if (status == 3) { // 顺序播放

current++; //下一首位置

if (current <= mp3Infos.size() - 1) {

Intent sendIntent = new Intent(UPDATE_ACTION);

sendIntent.putExtra(“current”, current);

// 发送广播,将被Activity组件中的BroadcastReceiver接收到

sendBroadcast(sendIntent);

path = mp3Infos.get(current).getUrl();

play(0);

}else {

mediaPlayer.seekTo(0);

current = 0;

Intent sendIntent = new Intent(UPDATE_ACTION);

sendIntent.putExtra(“current”, current);

// 发送广播,将被Activity组件中的BroadcastReceiver接收到

sendBroadcast(sendIntent);

}

} else if(status == 4) { //随机播放

current = getRandomIndex(mp3Infos.size() - 1);

System.out.println(“currentIndex ->” + current);

Intent sendIntent = new Intent(UPDATE_ACTION);

sendIntent.putExtra(“current”, current);

// 发送广播,将被Activity组件中的BroadcastReceiver接收到

sendBroadcast(sendIntent);

path = mp3Infos.get(current).getUrl();

play(0);

}

}

});

myReceiver = new MyReceiver();

IntentFilter filter = new IntentFilter();

filter.addAction(PlayerActivity.CTL_ACTION);

registerReceiver(myReceiver, filter);

}

/**

  • 获取随机位置

  • @param end

  • @return

*/

protected int getRandomIndex(int end) {

int index = (int) (Math.random() * end);

return index;

}

@Override

public IBinder onBind(Intent arg0) {

return null;

}

@Override

public void onStart(Intent intent, int startId) {

path = intent.getStringExtra(“url”); //歌曲路径

current = intent.getIntExtra(“listPosition”, -1); //当前播放歌曲的在mp3Infos的位置

msg = intent.getIntExtra(“MSG”, 0); //播放信息

if (msg == AppConstant.PlayerMsg.PLAY_MSG) { //直接播放音乐

play(0);

} else if (msg == AppConstant.PlayerMsg.PAUSE_MSG) { //暂停

pause();

} else if (msg == AppConstant.PlayerMsg.STOP_MSG) { //停止

stop();

} else if (msg == AppConstant.PlayerMsg.CONTINUE_MSG) { //继续播放

resume();

} else if (msg == AppConstant.PlayerMsg.PRIVIOUS_MSG) { //上一首

previous();

} else if (msg == AppConstant.PlayerMsg.NEXT_MSG) { //下一首

next();

} else if (msg == AppConstant.PlayerMsg.PROGRESS_CHANGE) { //进度更新

currentTime = intent.getIntExtra(“progress”, -1);

play(currentTime);

} else if (msg == AppConstant.PlayerMsg.PLAYING_MSG) {

handler.sendEmptyMessage(1);

}

super.onStart(intent, startId);

}

/**

  • 播放音乐

  • @param position

*/

private void play(int currentTime) {

try {

mediaPlayer.reset();// 把各项参数恢复到初始状态

mediaPlayer.setDataSource(path);

mediaPlayer.prepare(); // 进行缓冲

mediaPlayer.setOnPreparedListener(new PreparedListener(currentTime));// 注册一个监听器

handler.sendEmptyMessage(1);

} catch (Exception e) {

e.printStackTrace();

}

}

/**

  • 暂停音乐

*/

private void pause() {

if (mediaPlayer != null && mediaPlayer.isPlaying()) {

mediaPlayer.pause();

isPause = true;

}

}

private void resume() {

if (isPause) {

mediaPlayer.start();

isPause = false;

}

}

/**

  • 上一首

*/

private void previous() {

Intent sendIntent = new Intent(UPDATE_ACTION);

sendIntent.putExtra(“current”, current);

// 发送广播,将被Activity组件中的BroadcastReceiver接收到

sendBroadcast(sendIntent);

play(0);

}

/**

  • 下一首

*/

private void next() {

Intent sendIntent = new Intent(UPDATE_ACTION);

sendIntent.putExtra(“current”, current);

// 发送广播,将被Activity组件中的BroadcastReceiver接收到

sendBroadcast(sendIntent);

play(0);

}

/**

  • 停止音乐

*/

private void stop() {

if (mediaPlayer != null) {

mediaPlayer.stop();

try {

mediaPlayer.prepare(); // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数

} catch (Exception e) {

e.printStackTrace();

}

}

}

@Override

public void onDestroy() {

if (mediaPlayer != null) {

mediaPlayer.stop();

mediaPlayer.release();

mediaPlayer = null;

}

}

/**

  • 实现一个OnPrepareLister接口,当音乐准备好的时候开始播放

*/

private final class PreparedListener implements OnPreparedListener {

private int currentTime;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

我一直以来都有整理练习大厂面试题的习惯,有随时跳出舒服圈的准备,也许求职者已经很满意现在的工作,薪酬,觉得习惯而且安逸。

不过如果公司突然倒闭,或者部门被裁减,还能找到这样或者更好的工作吗?

我建议各位,多刷刷面试题,知道最新的技术,每三个月可以去面试一两家公司,因为你已经有不错的工作了,所以可以带着轻松的心态去面试,同时也可以增加面试的经验。

我可以将最近整理的一线互联网公司面试真题+解析分享给大家,大概花了三个月的时间整理2246页,帮助大家学习进步。

由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!以下是部分内容截图:

部分目录截图

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

,觉得习惯而且安逸。

不过如果公司突然倒闭,或者部门被裁减,还能找到这样或者更好的工作吗?

我建议各位,多刷刷面试题,知道最新的技术,每三个月可以去面试一两家公司,因为你已经有不错的工作了,所以可以带着轻松的心态去面试,同时也可以增加面试的经验。

我可以将最近整理的一线互联网公司面试真题+解析分享给大家,大概花了三个月的时间整理2246页,帮助大家学习进步。

由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!以下是部分内容截图:

[外链图片转存中…(img-vFhvKJu2-1713807336657)]

[外链图片转存中…(img-bhviaQmD-1713807336660)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值