原项目在这里  https://github.com/LineChen/XimalayaFM

播放列表存放在里application中,这个地方可以优化

1 PlayService中:播放路径从intent中获取
 @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;
}
2 activity 中
/**
*通知服务播放对应位置的音乐
*@paramposition
*/
private voidplayMusic(intposition,booleanplayNew){
Intent serviceIntent =newIntent(this, PlayService.class);
serviceIntent.putExtra(Constants.INTENT_EXTRA_CHANGE_MUSIC, playNew);
if(playNew){
if(position > -1&& position < FMApplication.INSTANCE.getPlayList().size())
serviceIntent.putExtra(Constants.INTENT_EXTRA_MUSIC_POSITION, position);
}
startService(serviceIntent);
}
caseR.id.ac_notify_play_ib:
//TODO点击播放按钮处理
isPlaying= !isPlaying;
Log.e("--============","activity:isPlaying : "+isPlaying);
playMusic(-1,false);
//更新playUI
updatePlayUI(isPlaying);
break;
*******************-----------*********************
caseR.id.ac_notify_pre_ib:
//TODO点击上一首按钮处理
if(--curPlayPosition== -1)
curPlayPosition= FMApplication.INSTANCE.getPlayList().size() - 1;
playMusic(curPlayPosition,true);
notifyPlayIb.setEnabled(false);
notifyPlayIb.setBackgroundResource(R.drawable.notify_pause_selector);
updateOtherUI(curPlayPosition);
break;
caseR.id.ac_notify_next_ib:
//TODO点击下一首按钮处理
if(++curPlayPosition== FMApplication.INSTANCE.getPlayList().size())
curPlayPosition=0;
playMusic(curPlayPosition,true);
notifyPlayIb.setEnabled(false);
notifyPlayIb.setBackgroundResource(R.drawable.notify_pause_selector);
updateOtherUI(curPlayPosition);
break;
**********************************
//-------------------------seekBar回调方法
@Override
public voidonStopTrackingTouch(SeekBar seekBar) {
intcur = seekBar.getProgress();
Intent intent =newIntent(
Constants.CAST_ACTION_SEEKBAR_PROCESS);
intent.putExtra(Constants.INTENT_EXTRA_MUSIC_CUR_LEN, cur);
lbManager.sendBroadcast(intent);
}
/**
*自定义广播接受者
*/
classPrgReceiverextendsBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//TODO接收播放服务组件中发送的进度广播
String action = intent.getAction();
if(action.equals(Constants.CAST_ACTION_MUSIC_PROGRESS)) {
intmax = intent.getIntExtra(
Constants.INTEXT_EXTRA_MUSIC_TOTAL_LEN,0);
intcur = intent.getIntExtra(
Constants.INTENT_EXTRA_MUSIC_CUR_LEN,0);
seekBar.setMax(max);
seekBar.setProgress(cur);
nowTimeTv.setText(dateFormat.format(newDate(cur)));
totalTimeTv.setText(dateFormat.format(newDate(max)));
}else if(action.equals(Constants.CAST_ACTION_MUSIC_COMPLETE)) {
//接收service发的播放完成的通知
notifyPlayIb.setBackgroundResource(R.drawable.notify_play_selector);
//正常播放完成,直接跳到下一首
curPlayPosition= intent.getIntExtra(Constants.INTENT_EXTRA_MUSIC_POSITION, -1);
//更新UI
updateOtherUI(curPlayPosition);
//播放完成,这段时间还没开始播放--
isPlaying=false;
notifyPlayIb.setEnabled(false);
updatePlayUI(isPlaying);
}else if(action.equals(Constants.CAST_ACTION_MUSIC_START)){
//TODO开始播放
// notifyPlayIb.setBackgroundResource(R.drawable.notify_pause_selector);
isPlaying=true;
notifyPlayIb.setEnabled(true);
updatePlayUI(isPlaying);
}else if(action.equals(Constants.CAST_ACTION_BUFFERING_UPDATE)){
intprogress = intent.getIntExtra(Constants.INTENT_EXTRA_BUFFERING_UPDATE,0);
intmax = intent.getIntExtra(Constants.INTEXT_EXTRA_MUSIC_TOTAL_LEN,0);
seekBar.setMax(max);
seekBar.setSecondaryProgress(progress);
// Log.e("--=====----==", "max:" + max + "senProgress:" + progress);
}
}
}
@Override
public void onDestroy() {
super.onDestroy();
lbManager.unregisterReceiver(prgReceiver);
}

android 音乐播放 启动方式 (3)服务通过发送广播来控制activity显示进度等相关推荐

  1. Android---Service(生命周期、启动方式、服务通信、实战演练、思维导图、高级音乐播放器-源码)

    目   录 一.服务的创建 二.服务的生命周期 三.服务的启动方式 (1)startService 方式 启动 服务 实战演练---startService (2)bindService 方式 启动 ...

  2. 基于android音乐播放器的设计

    本科毕业论文(设计)诚信声明 本人郑重声明:所呈交的毕业论文(设计),题目<---基于android音乐播放器的设计----------->是本人在指导教师的指导下,进行研究工作所取得的成 ...

  3. Android音乐播放器开发(2)—登录

    1. 说明 本音乐播放器基于Android开发,原为我和另外两个小伙伴在上学期间一起做的一个小项目,近来有时间整理一下.之前我有文章已经介绍了播放界面的功能实现(Android音乐播放器开发),但介绍 ...

  4. 基于android的音乐播放器毕业设计,基于android音乐播放器的毕业设计ppt

    <基于android音乐播放器的毕业设计ppt>由会员分享,可在线阅读,更多相关<基于android音乐播放器的毕业设计ppt(29页珍藏版)>请在人人文库网上搜索. 1.1. ...

  5. Android音乐播放器的设计与实现

    课程设计报告 实习名称 课程设计2 设计题目 Android音乐播放器的设计与实现 目录 摘要11 1 引言22 2 可行性分析22 2.1 技术可行性22 2.2 经济可行性33 2.3 管理可行性 ...

  6. Android音乐播放器开发(3)—注册

    1. 说明 本音乐播放器基于Android开发,原为我和另外两个小伙伴在上学期间一起做的一个小项目,近来有时间整理一下.之前我有文章已经介绍了播放界面的功能实现(Android音乐播放器开发),但介绍 ...

  7. Android音乐播放器开发(4)—修改密码

    1. 说明 本音乐播放器基于Android开发,原为我和另外两个小伙伴在上学期间一起做的一个小项目,近来有时间整理一下.之前我有文章已经介绍了播放界面的功能实现(Android音乐播放器开发),但介绍 ...

  8. android 音乐播放器论文,毕业论文:ANDROID音乐播放器

    用于设置歌曲播放进度条和显示当前播放时间和总时间.第四个用于显示播放控制和音量进度条. (3)界面的初始化操作 Android的每一个可视化界面,都有其的唯一的布局配置文件,该文件里面有各种布局方式, ...

  9. Android 音乐播放器制作(带有通知栏、Widget小挂件)

    Android 音乐播放器制作(带有通知栏显示.Widget小挂件) 我用的开发工具是AndroidStudio,我的手机是Android7.1.2,我的另一个测试手机是Android8.0. 整个项 ...

最新文章

  1. 从脑电图(EEG)中提取稳定的模式进行识别
  2. 开发日记-20190827 关键词 计算机网络
  3. Java 泛型背后的原理是什么?
  4. python socks5 代理服务
  5. Kubernetes:全面了解 Deployment
  6. webstorm 设置js或者html文件自动缩进为4个空格不生效
  7. element布局容器大小_Flutter完整开发实战详解(十六、详解自定义布局实战)
  8. 吴恩达深度学习4.1笔记_Convolutional Neural Networks_卷积神经网络基础
  9. django如何连接mysql_Django如何连接mysql
  10. redhat官网操作文档查找
  11. crossApp初级-CAView类-5
  12. 视频直播APP开发费用多少钱?
  13. 手机盾验证失败是什么意思_手机盾是什么意思
  14. 解决uni.request时uni.showtoast无效问题
  15. 积木式移动互联网App Hybrid框架-modular
  16. 使用AMD CPU,打造自己的深度学习服务器
  17. 内部比赛Cnbsp;Convertnbsp;Kilometersnbsp;tonbsp;…
  18. KeyError: ‘label‘
  19. 零基础入门数据挖掘之金融风控-贷款违约预测
  20. 看完这篇java单利模式文章,面试的时候再也不怕了

热门文章

  1. Ardunio开发实例-LM75温度传感器
  2. MATLAB中的偏最小二乘回归(PLSR)和主成分回归(PCR)
  3. 高速PCB基础——电阻,电容,电感(第三讲)
  4. K8S taint(污点)和tolerations(污点容忍)
  5. unity 2d贴图
  6. BT1120中的串行传输
  7. 淮阴工学院计算机网络题库,淮阴工学院计算机导论题库.doc
  8. Micropython——关于I2C和SoftI2C以及SPI和SoftSPI的区别
  9. CATIA V6二次开发——Automation之对象
  10. 【精华】搭建个人Web服务器_LAMP