android 音乐播放 启动方式 (3)服务通过发送广播来控制activity显示进度等
原项目在这里 https://github.com/LineChen/XimalayaFM
播放列表存放在里application中,这个地方可以优化
@Override
public void onCreate() {super.onCreate();mPlayer = new MediaPlayer(); //设置播放完成的监听 mPlayer.setOnCompletionListener(PlayService.this);//设置异步准备的监听mPlayer.setOnPreparedListener(this);mPlayer.setOnBufferingUpdateListener(this);//Register a callback to be invoked when the status of a network stream's buffer has changed.// 获取本地广播管理器lbManager = LocalBroadcastManager.getInstance(getApplicationContext());proReceiver = new ProReceiver();lbManager.registerReceiver(proReceiver, new IntentFilter(Constants.CAST_ACTION_SEEKBAR_PROCESS));
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {// 判断是否播放新的歌曲if (intent != null) {if (intent.getBooleanExtra(Constants.INTENT_EXTRA_CHANGE_MUSIC, false)) {// 获取播放路径 String path = intent.getStringExtra(Constants.INTENT_EXTRA_MUSIC_PATH);curPosition = intent.getIntExtra(Constants.INTENT_EXTRA_MUSIC_POSITION, -1);if(curPosition > -1 && curPosition < FMApplication.INSTANCE.getPlayList().size()){playMusic(curPosition);}}else {if (mPlayer.isPlaying()) {mPlayer.pause();// 暂停} else {mPlayer.start();// 播放new ProgressThread().start();//启动进度线程}}}return super.onStartCommand(intent, flags, startId);
}
/*** 播放音乐* @param position*/
private void playMusic(int position){if(position >= 0 && position < FMApplication.INSTANCE.getPlayList().size()){String path = FMApplication.INSTANCE.getPlayList().get(position).getPlayUrl64();//播放新歌曲 - resetmPlayer.reset();try {mPlayer.setDataSource(path);mPlayer.prepareAsync();} catch (Exception e) {e.printStackTrace();}}
}
/*** 播放一首音乐结束的回调方法,发送播放完毕的广播* @param mediaPlayer*/
@Override
public void onCompletion(MediaPlayer mediaPlayer) {if(++curPosition == FMApplication.INSTANCE.getPlayList().size())curPosition = 0;playMusic(curPosition);// TODO 发送播放完毕的广播Intent intent = new Intent(Constants.CAST_ACTION_MUSIC_COMPLETE);intent.putExtra(Constants.INTENT_EXTRA_MUSIC_POSITION, curPosition);lbManager.sendBroadcast(intent);
}
/*** 缓存数据成功回调* @param mediaPlayer*/
@Override
public void onPrepared(MediaPlayer mediaPlayer) {if (mPlayer.isPlaying()) {mPlayer.pause();// 暂停} else {mPlayer.start();// 播放new ProgressThread().start();//启动进度线程// TODO 发送开始播放广播给 PlayActivityIntent intent = new Intent(Constants.CAST_ACTION_MUSIC_START);lbManager.sendBroadcast(intent);}
}
/*** 缓存* @param mediaPlayer* @param progress*/
@Override
public void onBufferingUpdate(MediaPlayer mediaPlayer, int progress) {// TODO 发送开始播放广播给 PlayActivityIntent intent = new Intent(Constants.CAST_ACTION_BUFFERING_UPDATE);sumLen = mPlayer.getDuration();if(progress != 100){progress = (int) (progress / 100f * sumLen);intent.putExtra(Constants.INTENT_EXTRA_BUFFERING_UPDATE, progress);intent.putExtra(Constants.INTEXT_EXTRA_MUSIC_TOTAL_LEN, sumLen);总时长lbManager.sendBroadcast(intent);}
}
/*** 计算播放进度的线程*/
class ProgressThread extends Thread {@Overridepublic void run() {try {while (mPlayer != null && mPlayer.isPlaying()) {sumLen = mPlayer.getDuration();int currentPosition = mPlayer.getCurrentPosition();// 准备发送进度广播Intent intent = new Intent(Constants.CAST_ACTION_MUSIC_PROGRESS);intent.putExtra(Constants.INTEXT_EXTRA_MUSIC_TOTAL_LEN, sumLen);intent.putExtra(Constants.INTENT_EXTRA_MUSIC_CUR_LEN, currentPosition);lbManager.sendBroadcast(intent);Thread.sleep(500);//200ms发一次 ,必须大于0,否则 ANR}} catch (Exception e) {e.printStackTrace();}}
}
/*** 进度广播接收者*/
class ProReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {int cur = intent.getIntExtra(Constants.INTENT_EXTRA_MUSIC_CUR_LEN, 0);//从播放界面发送过来的进度mPlayer.seekTo(cur);}
}
@Override
public void onDestroy() {super.onDestroy();lbManager.unregisterReceiver(proReceiver);mPlayer.release();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {return null;
}
android 音乐播放 启动方式 (3)服务通过发送广播来控制activity显示进度等相关推荐
- Android---Service(生命周期、启动方式、服务通信、实战演练、思维导图、高级音乐播放器-源码)
目 录 一.服务的创建 二.服务的生命周期 三.服务的启动方式 (1)startService 方式 启动 服务 实战演练---startService (2)bindService 方式 启动 ...
- 基于android音乐播放器的设计
本科毕业论文(设计)诚信声明 本人郑重声明:所呈交的毕业论文(设计),题目<---基于android音乐播放器的设计----------->是本人在指导教师的指导下,进行研究工作所取得的成 ...
- Android音乐播放器开发(2)—登录
1. 说明 本音乐播放器基于Android开发,原为我和另外两个小伙伴在上学期间一起做的一个小项目,近来有时间整理一下.之前我有文章已经介绍了播放界面的功能实现(Android音乐播放器开发),但介绍 ...
- 基于android的音乐播放器毕业设计,基于android音乐播放器的毕业设计ppt
<基于android音乐播放器的毕业设计ppt>由会员分享,可在线阅读,更多相关<基于android音乐播放器的毕业设计ppt(29页珍藏版)>请在人人文库网上搜索. 1.1. ...
- Android音乐播放器的设计与实现
课程设计报告 实习名称 课程设计2 设计题目 Android音乐播放器的设计与实现 目录 摘要11 1 引言22 2 可行性分析22 2.1 技术可行性22 2.2 经济可行性33 2.3 管理可行性 ...
- Android音乐播放器开发(3)—注册
1. 说明 本音乐播放器基于Android开发,原为我和另外两个小伙伴在上学期间一起做的一个小项目,近来有时间整理一下.之前我有文章已经介绍了播放界面的功能实现(Android音乐播放器开发),但介绍 ...
- Android音乐播放器开发(4)—修改密码
1. 说明 本音乐播放器基于Android开发,原为我和另外两个小伙伴在上学期间一起做的一个小项目,近来有时间整理一下.之前我有文章已经介绍了播放界面的功能实现(Android音乐播放器开发),但介绍 ...
- android 音乐播放器论文,毕业论文:ANDROID音乐播放器
用于设置歌曲播放进度条和显示当前播放时间和总时间.第四个用于显示播放控制和音量进度条. (3)界面的初始化操作 Android的每一个可视化界面,都有其的唯一的布局配置文件,该文件里面有各种布局方式, ...
- Android 音乐播放器制作(带有通知栏、Widget小挂件)
Android 音乐播放器制作(带有通知栏显示.Widget小挂件) 我用的开发工具是AndroidStudio,我的手机是Android7.1.2,我的另一个测试手机是Android8.0. 整个项 ...
最新文章
- 从脑电图(EEG)中提取稳定的模式进行识别
- 开发日记-20190827 关键词 计算机网络
- Java 泛型背后的原理是什么?
- python socks5 代理服务
- Kubernetes:全面了解 Deployment
- webstorm 设置js或者html文件自动缩进为4个空格不生效
- element布局容器大小_Flutter完整开发实战详解(十六、详解自定义布局实战)
- 吴恩达深度学习4.1笔记_Convolutional Neural Networks_卷积神经网络基础
- django如何连接mysql_Django如何连接mysql
- redhat官网操作文档查找
- crossApp初级-CAView类-5
- 视频直播APP开发费用多少钱?
- 手机盾验证失败是什么意思_手机盾是什么意思
- 解决uni.request时uni.showtoast无效问题
- 积木式移动互联网App Hybrid框架-modular
- 使用AMD CPU,打造自己的深度学习服务器
- 内部比赛Cnbsp;Convertnbsp;Kilometersnbsp;tonbsp;…
- KeyError: ‘label‘
- 零基础入门数据挖掘之金融风控-贷款违约预测
- 看完这篇java单利模式文章,面试的时候再也不怕了