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)]

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

智能网联汽车的安全员高级考试涉及多个方面的专业知识,包括但不限于自动驾驶技术原理、车辆传感器融合、网络安全防护以及法律法规等内容。以下是针对该主题的一些核心知识点解析: ### 关于智能网联车安全员高级考试的核心内容 #### 1. 自动驾驶分级标准 国际自动机工程师学会(SAE International)定义了六个级别的自动驾驶等级,从L0到L5[^1]。其中,L3及以上级别需要安全员具备更高的应急处理能力。 #### 2. 车辆感知系统的组成与功能 智能网联车通常配备多种传感器,如激光雷达、毫米波雷达、摄像头超声波传感器等。这些设备协同工作以实现环境感知、障碍物检测等功能[^2]。 #### 3. 数据通信与网络安全 智能网联车依赖V2X(Vehicle-to-Everything)技术进行数据交换,在此过程中需防范潜在的网络攻击风险,例如中间人攻击或恶意软件入侵[^3]。 #### 4. 法律法规要求 不同国家地区对于无人驾驶测试及运营有着严格的规定,考生应熟悉当地交通法典中有关自动化驾驶部分的具体条款[^4]。 ```python # 示例代码:模拟简单决策逻辑 def decide_action(sensor_data): if sensor_data['obstacle'] and not sensor_data['emergency']: return 'slow_down' elif sensor_data['pedestrian_crossing']: return 'stop_and_yield' else: return 'continue_driving' example_input = {'obstacle': True, 'emergency': False, 'pedestrian_crossing': False} action = decide_action(example_input) print(f"Action to take: {action}") ``` 需要注意的是,“橙点同学”作为特定平台上的学习资源名称,并不提供官方认证的标准答案集;建议通过正规渠道获取教材并参加培训课程来准备此类资格认证考试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值