最近项目中要增加一些特殊的功能,实现音乐的在线播放。虽说网上源码一大把,demo一大堆,但是能用的其实寥寥无几,看来关键时刻还是自己动手,丰衣足食啊。话不多说,直接看效果图吧:

看是不是很美观。

该功能主要是实现:从后台请求一个音乐地址,进而实现在线播放,且能够支持暂停,快进,以及播放进度条,播放时间等。

代码不是很多,主要是用MediaPlayer重要工具类

这里控制着音乐的播放,暂停,开始播放等播放状态。

 public void play() {new Thread(new Runnable() {@Overridepublic void run() {if (player.mediaPlayer.isPlaying() || getPlayStatus() == PlayStatus.PLAYING) {player.pause();setPlayStatus(PlayStatus.PAUSE);} else if(getPlayStatus() == PlayStatus.NOPLAY || getPlayStatus() == PlayStatus.FINISH){if(getPlayStatus() == PlayStatus.FINISH){player.mediaPlayer.reset();//重置MediaPlayer到初始化状态player.mediaPlayer.seekTo(0);//须将播放时间设置到0;这样才能在下次播放是重新开始,否则会继续上次播放}player.playUrl(URLMUSIC);setPlayStatus(PlayStatus.PLAYING);}else if(getPlayStatus() == PlayStatus.PAUSE){player.start();//继续播放setPlayStatus(PlayStatus.PLAYING);}}}).start();}

这里要注意的是:

 player.mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {@Overridepublic void onBufferingUpdate(MediaPlayer mp, int percent) {Long totleLong = new Long((long) player.mediaPlayer.getDuration());Long currentLong = new Long((long) player.mediaPlayer.getCurrentPosition());String totleTime = formatter.format(mp.getDuration());String currentTime = formatter.format((mp.getCurrentPosition()));LogUtil.e(TAG,"totle:  " +totleTime+"当前:  " + currentTime);if(mp.isPlaying()){//减少误差,避免得到getDuration()的时间出问题---->在这里花费了好多的时间mySeekProgressListener.onMySeekProgressData(totleTime,currentTime,0);if(totleTime.equals(currentTime)){//用这样的方式判断完成,减少时间的误差LogUtil.e(TAG,"我进来啦!!!");setPlayStatus(PlayStatus.FINISH);player.mediaPlayer.pause();// player.mediaPlayer.release();}}}});

这里的  setOnBufferingUpdateListener是用于音乐或者视频在线缓冲的更新监听器

 public class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener {int progress;@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {LogUtil.e(TAG,"totle:  " +player.mediaPlayer.getDuration());this.progress  = progress * player.mediaPlayer.getDuration() / seekBar.getMax();}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {player.mediaPlayer.seekTo(progress);if(getPlayStatus() == PlayStatus.FINISH) {play();}}}

这里是坚挺拖动条的拖动状态,用于显示在线音乐的进度,当然是SeekBar能进行拖动。

以下是全部代码:

public class MainActivity extends Activity implements View.OnClickListener{private final int MUSIC_FINISH = 1000;@Bind(R.id.iv_bg_music)ImageView iv_bg_music;@Bind(R.id.titlebar_back_music)ImageView titlebar_back_music;@Bind(R.id.titlebar_title_music)TextView titlebar_title_music;@Bind(R.id.ib_paly_music)//播放音乐ImageButton ib_paly_music;@Bind(R.id.ll_to_play)//播放音乐LinearLayout ll_to_play;@Bind(R.id.tv_time_progress)//正在播放的时间TextView tv_time_progress;@Bind(R.id.tv_time_totle)//播放总时间TextView tv_time_totle;@Bind(R.id.sb_music_progress)//播放拖动条SeekBar sb_music_progress;private MusicPlay mausicPlay;private SimpleDateFormat formatter;private Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what){case MUSIC_FINISH:tv_time_progress.setText("0:00");//播放完毕后,重新设置没有播放的状态sb_music_progress.setProgress(0);ib_paly_music.setBackgroundResource(R.drawable.iv_paly);break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ButterKnife.bind(this);initListener();initView();}private void initView() {formatter = new SimpleDateFormat("mm:ss");formatter.setTimeZone(TimeZone.getTimeZone("GMT+00:00"));mausicPlay = MusicPlay.getInstance(this).setMySeekListener(sb_music_progress).setMySeekProgressListener(new MusicPlay.MySeekProgressListener() {@Overridepublic void onMySeekProgressData(String totleTime, String currentTime,int finishStatus) {if(finishStatus == 100){//播放完毕LogUtil.e("yuyahao","mian 时间 放放完啦!!! ");}else{tv_time_totle.setText(totleTime);if(totleTime.equals(currentTime)){//用时间字符串进行比较,防止出现两次的时间结束状态handler.postDelayed(new Runnable() {@Overridepublic void run() {Message msg = handler.obtainMessage();msg.what = MUSIC_FINISH;handler.sendMessage(msg);}}, 800);}else{tv_time_totle.setText(totleTime);tv_time_progress.setText(currentTime);}}}});ib_paly_music.setTag(R.drawable.iv_stop_paly);ib_paly_music.setBackgroundResource(R.drawable.iv_paly);}private void initListener() {ib_paly_music.setOnClickListener(this);titlebar_back_music.setOnClickListener(this);ll_to_play.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.ll_to_play:case R.id.ib_paly_music://博faNG或者是暂停Integer tag = (Integer) ib_paly_music.getTag();if(mausicPlay.isPlayIng()){//正在播放,去暂停播放ib_paly_music.setBackgroundResource(R.drawable.iv_paly);}else{//去进行播放ib_paly_music.setBackgroundResource(R.drawable.iv_stop_paly);}mausicPlay.play();break;case R.id.titlebar_back_music:onBackPressed();break;}}@Overrideprotected void onDestroy() {super.onDestroy();if(mausicPlay != null){mausicPlay.onDestroy();}}@Overridepublic void onBackPressed() {if(mausicPlay.isPlayIng()){}else{super.onBackPressed();}}
}

工具类:

/*** Created by fei on 2016/11/12.* 音乐在线播放  工具类*/
public class MusicPlay {private static final String TAG = "yyh";private static Player player;private static MusicPlay musicPlay;private String URLMUSIC = "http://abv.cn/music/红豆.mp3";private Context context;private static PlayStatus isPlaystatic  = PlayStatus.NOPLAY;//播放状态:默认0不播放,  1:开始博播放 ,2是暂停播放 ,3:是播放完毕private static SimpleDateFormat formatter;//private  SeekBar sb_music_progress;//当前播放的拖动条public enum  PlayStatus{NOPLAY(0),//默认0不播放PLAYING(1),//,1:开始博播放PAUSE(2),//,2是暂停播放FINISH(3);//3:是播放完毕private int status;PlayStatus(int status) {this.status = status;}public int getStatus() {return status;}public void setStatus(int status) {this.status = status;}}public MusicPlay(Context context) {this.context = context;}public static void  setPlayStatus(PlayStatus isPlaystatic){MusicPlay.isPlaystatic = isPlaystatic;}public PlayStatus getPlayStatus(){return this.isPlaystatic;}public static MusicPlay getInstance(Context context) {if (musicPlay == null) {musicPlay = new MusicPlay(context);formatter = new SimpleDateFormat("mm:ss");formatter.setTimeZone(TimeZone.getTimeZone("GMT+00:00"));}return musicPlay;}public  MusicPlay setMySeekListener(SeekBar sb_music_progress){sb_music_progress.setOnSeekBarChangeListener(new SeekBarChangeEvent());player  = new Player(sb_music_progress);initSetMediaPlaylistener();return musicPlay;}public  MusicPlay setMySeekProgressListener(MySeekProgressListener mySeekProgressListener){this.mySeekProgressListener = mySeekProgressListener;return musicPlay;}private static MySeekProgressListener mySeekProgressListener;public interface  MySeekProgressListener{void onMySeekProgressData(String totleTime, String currentTime, int finishStatus);}/*** 是否在进行播放* @return*/public boolean isPlayIng(){return player.mediaPlayer.isPlaying();}/*** 释放资源*/public void release(){player.mediaPlayer.release();}public void play() {new Thread(new Runnable() {@Overridepublic void run() {if (player.mediaPlayer.isPlaying() || getPlayStatus() == PlayStatus.PLAYING) {player.pause();setPlayStatus(PlayStatus.PAUSE);} else if(getPlayStatus() == PlayStatus.NOPLAY || getPlayStatus() == PlayStatus.FINISH){if(getPlayStatus() == PlayStatus.FINISH){player.mediaPlayer.reset();//重置MediaPlayer到初始化状态player.mediaPlayer.seekTo(0);//须将播放时间设置到0;这样才能在下次播放是重新开始,否则会继续上次播放}player.playUrl(URLMUSIC);setPlayStatus(PlayStatus.PLAYING);}else if(getPlayStatus() == PlayStatus.PAUSE){player.start();//继续播放setPlayStatus(PlayStatus.PLAYING);}}}).start();}/*** 开始播放*/public void startPlay() {new Thread(new Runnable() {@Overridepublic void run() {}}).start();}/*** 停止播放*/public void stopPlay() {}/*** 继续播放*/public void continuePlay() {}private static void initSetMediaPlaylistener(){/*player.mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {Long totleLong = new Long((long) player.mediaPlayer.getDuration());mySeekProgressListener.onMySeekProgressData(totleLong,0L,100);LogUtil.i(TAG, mp.getDuration()+"我已完成啦!!!!");}});*/player.mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {@Overridepublic void onBufferingUpdate(MediaPlayer mp, int percent) {Long totleLong = new Long((long) player.mediaPlayer.getDuration());Long currentLong = new Long((long) player.mediaPlayer.getCurrentPosition());String totleTime = formatter.format(mp.getDuration());String currentTime = formatter.format((mp.getCurrentPosition()));LogUtil.e(TAG,"totle:  " +totleTime+"当前:  " + currentTime);if(mp.isPlaying()){//减少误差,避免得到getDuration()的时间出问题---->在这里花费了好多的时间mySeekProgressListener.onMySeekProgressData(totleTime,currentTime,0);if(totleTime.equals(currentTime)){//用这样的方式判断完成,减少时间的误差LogUtil.e(TAG,"我进来啦!!!");setPlayStatus(PlayStatus.FINISH);player.mediaPlayer.pause();// player.mediaPlayer.release();}}}});}public class SeekBarChangeEvent implements SeekBar.OnSeekBarChangeListener {int progress;@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {LogUtil.e(TAG,"totle:  " +player.mediaPlayer.getDuration());this.progress  = progress * player.mediaPlayer.getDuration() / seekBar.getMax();}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {player.mediaPlayer.seekTo(progress);if(getPlayStatus() == PlayStatus.FINISH) {play();}}}/*** 销毁时*/public void onDestroy() {if (player != null && player.mediaPlayer.isPlaying()) {player.stop();
//            player.mediaPlayer.pause();player = null;}setPlayStatus(PlayStatus.NOPLAY);}public void palyByMobileSevice(){Intent intent = new Intent();Uri uri = Uri.parse(URLMUSIC);intent.setDataAndType(uri, "audio/mp3");//  intent.setDataAndType(uri, "audio/*");这里可以改成audio/mp3intent.setAction(Intent.ACTION_VIEW);context.startActivity(intent);}
}

最后一个:

public class Player implements OnBufferingUpdateListener, OnCompletionListener,OnPreparedListener{public MediaPlayer mediaPlayer;private SeekBar seekBar;private Timer mTimer = new Timer();public Player(SeekBar seekBar) {super();this.seekBar = seekBar;try {mediaPlayer = new MediaPlayer();mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);mediaPlayer.setOnBufferingUpdateListener(this);mediaPlayer.setOnPreparedListener(this);} catch (Exception e) {e.printStackTrace();}mTimer.schedule(timerTask, 0, 1000);}TimerTask timerTask = new TimerTask() {@Overridepublic void run() {if (mediaPlayer == null)return;if (mediaPlayer.isPlaying() && seekBar.isPressed() == false) {handler.sendEmptyMessage(0);}}};Handler handler = new Handler() {public void handleMessage(android.os.Message msg) {int position = mediaPlayer.getCurrentPosition();int duration = mediaPlayer.getDuration();if (duration >= 0) {long pos = seekBar.getMax() * position / duration;seekBar.setProgress((int) pos);}};};public void play() {mediaPlayer.start();}/*** * @param url*/public void playUrl(String url) {try {mediaPlayer.reset();mediaPlayer.setDataSource(url);mediaPlayer.prepare();mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);// 通过异步的方式装载媒体资源/*mediaPlayer.prepareAsync();mediaPlayer.setOnPreparedListener(new OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {// 装载完毕回调mediaPlayer.start();}});*/} catch (IllegalArgumentException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();} catch (IllegalStateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public void pause() {mediaPlayer.pause();}public void start() {mediaPlayer.start();}public void stop() {if (mediaPlayer != null) {mediaPlayer.stop();mediaPlayer.release();mediaPlayer = null;}}@Overridepublic void onPrepared(MediaPlayer mp) {mp.start();Log.e("mediaPlayer", "onPrepared");}@Overridepublic void onCompletion(MediaPlayer mp) {Log.e("mediaPlayer", "onCompletion");}@Overridepublic void onBufferingUpdate(MediaPlayer mp, int percent) {seekBar.setSecondaryProgress(percent);int currentProgress = seekBar.getMax()* mediaPlayer.getCurrentPosition() / mediaPlayer.getDuration();Log.e(currentProgress + "% play", percent + " buffer");}}

但是到了最后竟然忘记写权限了:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

否则就会播放不出来。报一些其他类型的错误。

好了,最后贴上项目地址:http://download.csdn.net/detail/androidstarjack/9690396

另外你觉得此篇文章对您有所帮助 请关注终端研发部,QQ交流群 :232203809

手把手叫你制作一个精美的在线音乐播放器相关推荐

  1. python 定时在线音乐播放器

    目标 利用python来制作一个简单的定时音乐播放器,并且为它进行打包,像我们平时使用的软件一样放在桌面使用,像下图展示,整体操作如下. 语言:python 工具:jupyter 前提准备 在终端下载 ...

  2. 基于 Qt5 ( C++ ) 开发的一个小巧精美的本地音乐播放器

    LightMusicPlayer --南京大学2019秋季学期 "高级程序设计" 课程设计三 基于Qt5开发的一个小巧精美的本地音乐播放器 代码注释详细,适合作为一个用于入门的Qt ...

  3. 运用Java制作一个属于自己的音乐播放软件

    运用Java制作一个属于自己的音乐播放软件 前言 上个寒假小编用python做了一个音乐播放软件(博客链接为:)运用tkinter.爬虫做了一个播放音乐的小程序(动态显示歌词[歌词向上翻滚]),觉得效 ...

  4. 在线音乐播放器-----酷狗音乐api接口抓取

    首先身为一个在线音乐播放器,需要前端和数据库的搭配使用. 在数据库方面,我们没有办法制作,首先是版权问题,再加上数据量.所以我们需要借用其他网络播放器的数据库. 但是这些在线播放器,如百度,酷狗,酷我 ...

  5. python播放在线音乐_Python实现在线音乐播放器

    最近这几天,学习了一下python,对于爬虫比较感兴趣,就做了一个简单的爬虫项目,使用Python的库Tkinsert做了一个界面,感觉这个库使用起来还是挺方便的,音乐的数据来自网易云音乐的一个接口, ...

  6. python播放网络音乐_python使用Tkinter实现在线音乐播放器

    本文实例使用Tkinter实现在线音乐播放器的具体代码,供大家参考,具体内容如下 1.先使用Tkinter库写界面 2.写点击按钮触发的事件 (1).使用网易音乐的api,返回数据包装成json格式数 ...

  7. 【简短测评】在线音乐播放器,哪一款适合写代码时候使用

    在线音乐播放器简短测评 如果写代码时总想听听音乐 如果写代码时总想听听音乐 我是个写代码时候不想让耳朵闲下来的人.听英语练听力,占用了脑子,代码也写不好,所以只能听歌,不用往脑子里进的那种. 一直以来 ...

  8. python调用默认播放器_python使用Tkinter实现在线音乐播放器

    本文实例使用Tkinter实现在线音乐播放器的具体代码,供大家参考,具体内容如下 1.先使用Tkinter库写界面 2.写点击按钮触发的事件 (1).使用网易音乐的api,返回数据包装成json格式数 ...

  9. Andriod小项目——在线音乐播放器

    Andriod小项目--在线音乐播放器 转载请注明:http://blog.csdn.net/sunkes/article/details/51189189 Android在线音乐播放器 从大一开始就 ...

最新文章

  1. CSS0 -- 静态、自适应、流式、响应式
  2. sap.ca.scfld.md.ComponentBase.extend
  3. 转载并学习实现三重DES加密解密代码(一)
  4. vue请求封装,Store-状态管理部分(文档笔记)
  5. Pure Pursuit纯跟踪算法Python/Matlab算法实现
  6. java与c基本数据类型比较,C++与Java基本数据类型比较
  7. 数据结构—栈的应用(括号匹配、表达式求值、递归)
  8. 计算机教学能力大赛实施报告模板,教学能力比赛教学实施报告现场汇报PPT模板-橙色主题.pptx...
  9. 基于程序员职业对于婚配问题的研究——程序员为何单身?
  10. TCP编程-端口扫描器
  11. 清洗outliers
  12. 图片去水印免费软件哪个好?这几款软件值得一看
  13. Python使用Pillow库进行图像
  14. spring-data-jpa hiberneate 中 uui的生成策略
  15. C1认证学习笔记2--计算机通识
  16. python论文题目大全_论文题目大全
  17. springmvc+mybatis 无极限树形结构菜单
  18. 浙大160位学者入选2020“中国高被引学者” 榜单!
  19. 如何使用WRLD构建教练假期展示柜
  20. 密码学之基本概念(01)

热门文章

  1. 「06」IDEA2019.3(最全-从入门到癫狂
  2. 重庆市计算机专业高考试题,职业高中高考计算机专业试卷4
  3. Base64处理byte[ ]和base64字符串之间的转换
  4. 时间戳和时间字符串互转
  5. C# 2.0 泛型编程 选择自 shoutor 的 Blog
  6. golang 1-helle golang
  7. 吞食天地2西瓜魅影 萌新版自通攻略
  8. 推荐多款免费的开源建站系统和内容管理系统
  9. 学习笔记-频率域滤波(2)-取样函数
  10. Python库(part02)