好了,下面贴一下整个Activity的实现代码,主要是播放的各种状态的实现,因为这个音乐播放器并没有完全开发完,所以朋友们需要弄清楚这一点。如果对代码的实现有不清楚的,可以给小巫留言,小巫有空一定给大家解答。

PlayerActivity.java代码:

转存失败重新上传取消

package com.wwj.sb.activity;import java.util.List;import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;import com.wwj.sb.domain.AppConstant;
import com.wwj.sb.domain.Mp3Info;
import com.wwj.sb.utils.MediaUtil;/*** 播放音乐界面* @author wwj* 从主界面传递过来歌曲的Id、歌曲名、歌手、歌曲路径、播放状态*/
public class PlayerActivity extends Activity{private TextView musicTitle = null;private TextView musicArtist = null;private Button previousBtn; // 上一首private Button repeatBtn;   // 重复(单曲循环、全部循环)private Button playBtn;       // 播放(播放、暂停)private Button shuffleBtn; // 随机播放private Button nextBtn;     // 下一首private Button searchBtn; //查找歌曲private Button queueBtn;  //歌曲列表private SeekBar music_progressBar;    //歌曲进度private TextView currentProgress; //当前进度消耗的时间private TextView finalProgress;      //歌曲时间private String title;     //歌曲标题private String artist;        //歌曲艺术家private String url;          //歌曲路径private int listPosition; //播放歌曲在mp3Infos的位置private int currentTime;  //当前歌曲播放时间private int duration;     //歌曲长度private int flag;         //播放标识private int repeatState;private final int isCurrentRepeat = 1; // 单曲循环private final int isAllRepeat = 2;        // 全部循环private final int isNoneRepeat = 3;     // 无重复播放private boolean isPlaying;              // 正在播放private boolean isPause;                 // 暂停private boolean isNoneShuffle;          // 顺序播放private boolean isShuffle;          // 随机播放private List<Mp3Info> mp3Infos;private PlayerReceiver playerReceiver;  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";//音乐播放长度改变动作public static final String MUSIC_PLAYING = "com.wwj.action.MUSIC_PLAYING";    //音乐正在播放动作public static final String REPEAT_ACTION = "com.wwj.action.REPEAT_ACTION"; //音乐重复播放动作public static final String SHUFFLE_ACTION = "com.wwj.action.SHUFFLE_ACTION";//音乐随机播放动作@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.play_activity_layout);musicTitle = (TextView) findViewById(R.id.musicTitle);musicArtist = (TextView) findViewById(R.id.musicArtist);findViewById();setViewOnclickListener();mp3Infos = MediaUtil.getMp3Infos(PlayerActivity.this);playerReceiver = new PlayerReceiver();IntentFilter filter = new IntentFilter();filter.addAction(UPDATE_ACTION);filter.addAction(MUSIC_CURRENT);filter.addAction(MUSIC_DURATION);registerReceiver(playerReceiver, filter);}/*** 从界面上根据id获取按钮*/private void findViewById() {previousBtn = (Button) findViewById(R.id.previous_music);repeatBtn = (Button) findViewById(R.id.repeat_music);playBtn = (Button) findViewById(R.id.play_music);shuffleBtn = (Button) findViewById(R.id.shuffle_music);nextBtn = (Button) findViewById(R.id.next_music);searchBtn = (Button) findViewById(R.id.search_music);queueBtn = (Button) findViewById(R.id.play_queue);music_progressBar = (SeekBar) findViewById(R.id.audioTrack);currentProgress = (TextView) findViewById(R.id.current_progress);finalProgress = (TextView) findViewById(R.id.final_progress);}/*** 给每一个按钮设置监听器*/private void setViewOnclickListener() {ViewOnclickListener ViewOnClickListener = new ViewOnclickListener();previousBtn.setOnClickListener(ViewOnClickListener);repeatBtn.setOnClickListener(ViewOnClickListener);playBtn.setOnClickListener(ViewOnClickListener);shuffleBtn.setOnClickListener(ViewOnClickListener);nextBtn.setOnClickListener(ViewOnClickListener);searchBtn.setOnClickListener(ViewOnClickListener);queueBtn.setOnClickListener(ViewOnClickListener);music_progressBar.setOnSeekBarChangeListener(new SeekBarChangeListener());}/*** 在OnResume中初始化和接收Activity数据*/@Overrideprotected void onResume() {super.onResume();Intent intent = getIntent();Bundle bundle = intent.getExtras();title = bundle.getString("title");artist = bundle.getString("artist");url = bundle.getString("url");listPosition = bundle.getInt("listPosition");repeatState = bundle.getInt("repeatState");isShuffle = bundle.getBoolean("shuffleState");flag = bundle.getInt("MSG");currentTime = bundle.getInt("currentTime");duration = bundle.getInt("duration");initView();}/*** 初始化界面*/public void initView() {musicTitle.setText(title);musicArtist.setText(artist);music_progressBar.setProgress(currentTime);music_progressBar.setMax(duration);switch (repeatState) {case isCurrentRepeat: // 单曲循环shuffleBtn.setClickable(false);repeatBtn.setBackgroundResource(R.drawable.repeat_current_selector);break;case isAllRepeat: // 全部循环shuffleBtn.setClickable(false);repeatBtn.setBackgroundResource(R.drawable.repeat_all_selector);break;case isNoneRepeat: // 无重复shuffleBtn.setClickable(true);repeatBtn.setBackgroundResource(R.drawable.repeat_none_selector);break;}if(isShuffle) {isNoneShuffle = false;shuffleBtn.setBackgroundResource(R.drawable.shuffle_selector);repeatBtn.setClickable(false);} else {isNoneShuffle = true;shuffleBtn.setBackgroundResource(R.drawable.shuffle_none_selector);repeatBtn.setClickable(true);}if(flag == AppConstant.PlayerMsg.PLAYING_MSG) {   //如果播放信息是正在播放Toast.makeText(PlayerActivity.this, "正在播放--" + title, 1).show();}else if(flag == AppConstant.PlayerMsg.PLAY_MSG) { //如果是点击列表播放歌曲的话play();}playBtn.setBackgroundResource(R.drawable.play_selector);isPlaying = true;isPause = false;}/*** 反注册广播*/@Overrideprotected void onStop() {super.onStop();unregisterReceiver(playerReceiver);}@Overrideprotected void onDestroy() {super.onDestroy();}/*** 控件点击事件* @author wwj**/private class ViewOnclickListener implements OnClickListener {Intent intent = new Intent();@Overridepublic void onClick(View v) {switch(v.getId()) {case R.id.play_music:if (isPlaying) {playBtn.setBackgroundResource(R.drawable.pause_selector);intent.setAction("com.wwj.media.MUSIC_SERVICE");intent.putExtra("MSG", AppConstant.PlayerMsg.PAUSE_MSG);startService(intent);isPlaying = false;isPause = true;} else if (isPause) {playBtn.setBackgroundResource(R.drawable.play_selector);intent.setAction("com.wwj.media.MUSIC_SERVICE");intent.putExtra("MSG", AppConstant.PlayerMsg.CONTINUE_MSG);startService(intent);isPause = false;isPlaying = true;}break;case R.id.previous_music:     //上一首歌曲previous_music();break;case R.id.next_music:         //下一首歌曲next_music();break;case R.id.repeat_music:           //重复播放音乐if (repeatState == isNoneRepeat) {repeat_one();shuffleBtn.setClickable(false);    //是随机播放变为不可点击状态repeatState = isCurrentRepeat;  } else if (repeatState == isCurrentRepeat) {repeat_all();shuffleBtn.setClickable(false);repeatState = isAllRepeat;} else if (repeatState == isAllRepeat) {repeat_none();shuffleBtn.setClickable(true);repeatState = isNoneRepeat;}Intent intent = new Intent(REPEAT_ACTION);switch (repeatState) {case isCurrentRepeat: // 单曲循环repeatBtn.setBackgroundResource(R.drawable.repeat_current_selector);Toast.makeText(PlayerActivity.this, R.string.repeat_current,Toast.LENGTH_SHORT).show();intent.putExtra("repeatState", isCurrentRepeat);sendBroadcast(intent);break;case isAllRepeat: // 全部循环repeatBtn.setBackgroundResource(R.drawable.repeat_all_selector);Toast.makeText(PlayerActivity.this, R.string.repeat_all,Toast.LENGTH_SHORT).show();intent.putExtra("repeatState", isAllRepeat);sendBroadcast(intent);break;case isNoneRepeat: // 无重复repeatBtn.setBackgroundResource(R.drawable.repeat_none_selector);Toast.makeText(PlayerActivity.this, R.string.repeat_none,Toast.LENGTH_SHORT).show();intent.putExtra("repeatState", isNoneRepeat);break;}break;case R.id.shuffle_music:         //随机播放状态Intent shuffleIntent = new Intent(SHUFFLE_ACTION);if (isNoneShuffle) {         //如果当前状态为非随机播放,点击按钮之后改变状态为随机播放shuffleBtn.setBackgroundResource(R.drawable.shuffle_selector);Toast.makeText(PlayerActivity.this, R.string.shuffle,Toast.LENGTH_SHORT).show();isNoneShuffle = false;isShuffle = true;shuffleMusic();repeatBtn.setClickable(false);shuffleIntent.putExtra("shuffleState", true);sendBroadcast(shuffleIntent);} else if (isShuffle) {shuffleBtn.setBackgroundResource(R.drawable.shuffle_none_selector);Toast.makeText(PlayerActivity.this, R.string.shuffle_none,Toast.LENGTH_SHORT).show();isShuffle = false;isNoneShuffle = true;repeatBtn.setClickable(true);shuffleIntent.putExtra("shuffleState", false);sendBroadcast(shuffleIntent);}break;}}}/*** 实现监听Seekbar的类* @author wwj**/private class SeekBarChangeListener implements OnSeekBarChangeListener {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {if(fromUser) {audioTrackChange(progress);  //用户控制进度的改变}}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}}/*** 播放音乐*/public void play() {//开始播放的时候为顺序播放repeat_none();Intent intent = new Intent();intent.setAction("com.wwj.media.MUSIC_SERVICE");intent.putExtra("url", url);intent.putExtra("listPosition", listPosition);intent.putExtra("MSG", flag);startService(intent);}/*** 随机播放*/public void shuffleMusic() {Intent intent = new Intent(CTL_ACTION);intent.putExtra("control", 4);sendBroadcast(intent);}public void audioTrackChange(int progress) {Intent intent = new Intent();intent.setAction("com.wwj.media.MUSIC_SERVICE");intent.putExtra("url", url);intent.putExtra("listPosition", listPosition);if(isPause) {intent.putExtra("MSG", AppConstant.PlayerMsg.PAUSE_MSG);}else {intent.putExtra("MSG", AppConstant.PlayerMsg.PROGRESS_CHANGE);}intent.putExtra("progress", progress);startService(intent);}/*** 单曲循环*/public void repeat_one() {Intent intent = new Intent(CTL_ACTION);intent.putExtra("control", 1);sendBroadcast(intent);}/*** 全部循环*/public void repeat_all() {Intent intent = new Intent(CTL_ACTION);intent.putExtra("control", 2);sendBroadcast(intent);}/*** 顺序播放*/public void repeat_none() {Intent intent = new Intent(CTL_ACTION);intent.putExtra("control", 3);sendBroadcast(intent);}/*** 上一首*/public void previous_music() {playBtn.setBackgroundResource(R.drawable.play_selector);listPosition = listPosition - 1;if(listPosition >= 0) {Mp3Info mp3Info = mp3Infos.get(listPosition);     //上一首MP3musicTitle.setText(mp3Info.getTitle());musicArtist.setText(mp3Info.getArtist());url = mp3Info.getUrl();Intent intent = new Intent();intent.setAction("com.wwj.media.MUSIC_SERVICE");intent.putExtra("url", mp3Info.getUrl());intent.putExtra("listPosition", listPosition);intent.putExtra("MSG", AppConstant.PlayerMsg.PRIVIOUS_MSG);startService(intent);}else {Toast.makeText(PlayerActivity.this, "没有上一首了", Toast.LENGTH_SHORT).show();}}/*** 下一首*/public void next_music() {playBtn.setBackgroundResource(R.drawable.play_selector);listPosition = listPosition + 1;if(listPosition <= mp3Infos.size() - 1) {Mp3Info mp3Info = mp3Infos.get(listPosition);url = mp3Info.getUrl();musicTitle.setText(mp3Info.getTitle());musicArtist.setText(mp3Info.getArtist());Intent intent = new Intent();intent.setAction("com.wwj.media.MUSIC_SERVICE");intent.putExtra("url", mp3Info.getUrl());intent.putExtra("listPosition", listPosition);intent.putExtra("MSG", AppConstant.PlayerMsg.NEXT_MSG);startService(intent);} else {Toast.makeText(PlayerActivity.this, "没有下一首了", Toast.LENGTH_SHORT).show();}}/*** 用来接收从service传回来的广播的内部类* @author wwj**/public class PlayerReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if(action.equals(MUSIC_CURRENT)) {currentTime = intent.getIntExtra("currentTime", -1);currentProgress.setText(MediaUtil.formatTime(currentTime));music_progressBar.setProgress(currentTime);} else if(action.equals(MUSIC_DURATION)) {int duration = intent.getIntExtra("duration", -1);music_progressBar.setMax(duration);finalProgress.setText(MediaUtil.formatTime(duration));} else if(action.equals(UPDATE_ACTION)) {//获取Intent中的current消息,current代表当前正在播放的歌曲listPosition = intent.getIntExtra("current", -1);url = mp3Infos.get(listPosition).getUrl();if(listPosition >= 0) {musicTitle.setText(mp3Infos.get(listPosition).getTitle());musicArtist.setText(mp3Infos.get(listPosition).getArtist());}if(listPosition == 0) {finalProgress.setText(MediaUtil.formatTime(mp3Infos.get(listPosition).getDuration()));playBtn.setBackgroundResource(R.drawable.pause_selector);isPause = true;}}}}}

以上代码主要有以下几点实现:

1. 播放状态(上一首、下一首、暂停音乐、播放音乐、重复播放、随机播放)

2. 进度更新(自定义Seekbar,Seekbar触发时间控制音乐播放的位置)

3. 接收来自Service的广播,对播放时间,歌曲信息的UI更新。

要注意的地方:

1. 在onResume里接收来自HomeActivity里通过Intent传过来的数据,它是保存在bundle当中的,所以可以通过Bundle来取数据。

2. 通过startSercice来启动服务,在启动之前我们往服务传的数据

/*** 播放音乐*/public void play() {//开始播放的时候为顺序播放repeat_none();Intent intent = new Intent();intent.setAction("com.wwj.media.MUSIC_SERVICE");intent.putExtra("url", url);intent.putExtra("listPosition", listPosition);intent.putExtra("MSG", flag);startService(intent);}

可以看到只有url(音乐播放路径)、listPosition(列表的点击位置,也就是mp3Infos的位置)、MSG(代表播放信息)。这几个是来控制播放的,在Service会很清楚看到这几个参数的作用。这会在下一篇博客中介绍。

Android应用开发-MP3音乐播放器代码实现(三)相关推荐

  1. Android应用开发--MP3音乐播放器代码实现(一)

    Android应用开发--MP3音乐播放器代码实现(一) 需求1:将内存卡中的MP3音乐读取出来并显示到列表当中 1. 从数据库中查询所有音乐数据,保存到List集合当中,List当中存放的是Mp3I ...

  2. Android应用开发--MP3音乐播放器代码实现(二)

    2013年5月25日 简.美音乐播放器开发 小巫在这里罗列这个播放器已经实现的功能: 1.   自动显示音乐列表 2.   点击列表播放音乐 3.   长按列表弹出对话框 4.   暂停音乐 5.   ...

  3. Android应用开发--MP3音乐播放器代码实现(二,android开发实例大全

    } switch (repeatState) { case isCurrentRepeat: // 单曲循环 repeatBtn .setBackgroundResource(R.drawable.r ...

  4. Android应用开发--MP3音乐播放器滚动歌词实现

    Android应用开发--MP3音乐播放器滚动歌词实现 2013年6月2日  简.美音乐播放器开发记录 -----前话 有网友给我博客评论说,让我借鉴好的Android代码,代码贴出来的时候最好整体先 ...

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

    Android应用开发--MP3音乐播放器Service实现 2013年5月29日简.美音乐播放器开发记录 让网友们久等啦,关于简.美音乐播放器的开发,最重要的Service类总算是要发博了.关于An ...

  6. Android应用开发 MP3音乐播放器滚动歌词实现

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Andr ...

  7. Android应用开发--MP3音乐播放器滚动歌词实现,flutter跳转动画

    2. 自定义View 3. 加入布局文件 4. 编写歌词处理类 5. 在Service里面实现同步更新歌词 ----代码实现 –LrcContent.java package com.wwj.sb.d ...

  8. 音乐应用开发Android应用开发--MP3音乐播放器界面设计(2)

    在写这篇文章之前,xxx已写过了几篇关于改音乐应用开发主题的文章,想要了解的朋友可以去翻一下之前的文章 Android应用开发--MP3音乐播放器界面计划(2) 2013年5月25日 简.美音乐播放器 ...

  9. Android应用开发--MP3音乐播放器界面设计(1)

    Android应用开发--MP3音乐播放器界面设计(1)                                           近期突然想自己开发一款MP3播放器,所以就有了上面的界面, ...

  10. Android应用开发--MP3音乐播放器界面设计(2)

    Android应用开发--MP3音乐播放器界面设计(2) 2013年5月25日 简.美音乐播放器开发 真得很无奈,原本打算很快结束这个实战项目的,但因为各种满课.学科.杂事给耽误了进度,现在小巫的这个 ...

最新文章

  1. [Android实例] 最全的Android开发资源整理--进阶必备
  2. 再学 GDI+[83]: TGPImage(3) - 平行四边形变换
  3. 大数据入门笔记(三)
  4. mysql 剔除不可见字符_不可见字符,Excel里最隐蔽的坑
  5. mysql 变量生命周期_Go: 延长变量的生命周期
  6. 同时面了腾讯三个部门,拿下offer!
  7. Java中怎么控制线程訪问资源的数量
  8. 十几款应用广泛的第三方URL解析库被曝8个漏洞
  9. 201521123070 《JAVA程序设计》第6周学习总结
  10. error: component 'clippy' for target 'x86_64-unknown-linux-gnu' is unavailable for download 解决办法
  11. js中英文字符与中文字符长度区别
  12. mtk系统如何制作差分包且正确签名?
  13. 应用于arcgis的代码,长期更新…
  14. 达人评测 iPad Pro 2021怎么样
  15. 看图猜地理-黑龙江篇
  16. 猫眼电影经典电影爬取
  17. Dubious Document
  18. 知乎书籍排行网站——建站始末
  19. SPA首屏加载速度慢怎么解决?
  20. win7下用VS2008写视频聊天程序,求VFW教程?qzvgK

热门文章

  1. mac 下载appium
  2. 2022华为杯研究生数学建模竞赛选题建议
  3. UVC协议学习2--UVC请求格式分析
  4. 浸没式液冷,阿里云新立项两大技术白皮书
  5. 西刺代理python_python爬取西刺代理所有数据 !
  6. c php乱码,Cknife的PHP功能部分修正,解决SHELL无法回显以及中文乱码
  7. navicat连接mangoDB数据库并使用
  8. 麻省理工18年春软件构造课程阅读03“测试”
  9. mdl文件是c语言,mdl文件扩展名,mdl文件怎么打开?
  10. android电视盒刷机工具,android电视盒如何刷机