Android音乐播放器

使用到Android的Actiivity和Service组件

播放音频的代码应该运行在服务中,定义一个播放服务MusicService,服务里定义play、stop、pause、continuePlay等方法

把这几个方法抽取成一个接口MusicInterface

定义一个中间人类,继承Binder,实现MusicInterface

操作按钮等使用Activity与用户交互

同时为了把服务所在进程变成服务进程,防止Activity销毁时依旧执行Service,需要使用Service启动的混合调用,即先使用startService(),然后使用bindService()方法。

原理:使用bindService()方法,启动service。在ServiceConnection的onServiceConnected()方法中返回一个iBinder对象,通过该对象可以操作音乐service中的播放音乐的方法。

播放服务

代码:

MainActivity:

1 importandroid.app.Activity;2 importandroid.content.ComponentName;3 importandroid.content.Intent;4 importandroid.content.ServiceConnection;5 importandroid.os.Bundle;6 importandroid.os.Handler;7 importandroid.os.IBinder;8 importandroid.view.View;9 importandroid.widget.SeekBar;10 importandroid.widget.SeekBar.OnSeekBarChangeListener;11

12 public class MainActivity extendsActivity {13

14 privateMusicInterface mi;15

16 static Handler handler = newHandler() {17 public voidhandleMessage(android.os.Message msg) {18 Bundle bundle =msg.getData();19 //取出消息携带的数据

20 int duration = bundle.getInt("duration");21 int currentPosition = bundle.getInt("currentPosition");22 //刷新播放进度

23 sb.setMax(duration);24 sb.setProgress(currentPosition);25 };26 };27

28

29

30 private staticSeekBar sb;31 @Override32 protected voidonCreate(Bundle savedInstanceState) {33 super.onCreate(savedInstanceState);34 setContentView(R.layout.activity_main);35 sb =(SeekBar) findViewById(R.id.sb);36 //给sb设置一个拖动侦听

37 sb.setOnSeekBarChangeListener(newOnSeekBarChangeListener() {38 //停止拖动时调用

39 @Override40 public voidonStopTrackingTouch(SeekBar seekBar) {41 //根据拖动进度,改变音乐播放进度

42 mi.seekTo(seekBar.getProgress());43 }44 //开始拖动时调用

45 @Override46 public voidonStartTrackingTouch(SeekBar seekBar) {47 //TODO Auto-generated method stub

48

49 }50 //拖动的时候不断调用

51 @Override52 public void onProgressChanged(SeekBar seekBar, intprogress,53 booleanfromUser) {54 //TODO Auto-generated method stub

55

56 }57 });58 Intent intent = new Intent(this, MusicService.class);59 //先start启动MusicService,再bind

60 startService(intent);61 MyServiceConn conn = newMyServiceConn();62 bindService(intent, conn, BIND_AUTO_CREATE);63 }64

65 class MyServiceConn implementsServiceConnection {66

67 @Override68 public voidonServiceConnected(ComponentName name, IBinder service) {69 mi =(MusicInterface) service;70 }71

72 @Override73 public voidonServiceDisconnected(ComponentName name) {74

75 }76

77 }78

79 public voidplay(View v) {80 mi.play();81 }82

83 public voidcontinuePlay(View v) {84 mi.continuePlay();85 }86

87 public voidpause(View v) {88 mi.pause();89 }90

91 public voidstop(View v) {92 mi.stop();93 }94 }

MusicService:

1 importjava.util.Timer;2 importjava.util.TimerTask;3

4 importandroid.app.Service;5 importandroid.content.Intent;6 importandroid.media.MediaPlayer;7 importandroid.media.MediaPlayer.OnPreparedListener;8 importandroid.os.Binder;9 importandroid.os.Bundle;10 importandroid.os.IBinder;11 importandroid.os.Message;12

13 public class MusicService extendsService {14 privateMediaPlayer player;15 privateTimer timer;16

17 @Override18 publicIBinder onBind(Intent intent) {19 //TODO Auto-generated method stub

20 return newMusicMiddleMan();21 }22

23 class MusicMiddleMan extends Binder implementsMusicInterface {24 public voidplay() {25 MusicService.this.play();26 }27

28 public voidpause() {29 MusicService.this.pause();30 }31

32 public voidcontinuePlay() {33 MusicService.this.continuePlay();34 }35

36 public voidstop() {37 MusicService.this.stop();38 }39

40 @Override41 public void seekTo(intprogress) {42 //TODO Auto-generated method stub

43 MusicService.this.seekTo(progress);44 }45

46

47 }48

49 @Override50 public voidonCreate() {51 //TODO Auto-generated method stub

52 super.onCreate();53 player = newMediaPlayer();54

55 }56

57 public voidplay() {58 System.out.println("播放");59 if (player == null) {60 player = newMediaPlayer();61 }62 player.reset();63 try{

//设置网络资源64 player.setDataSource("http://192.168.5.100:8080/HEYJUDE.mp3");65 //异步获取网络资源

66 player.prepareAsync();67 player.setOnPreparedListener(newOnPreparedListener() {68

69 @Override70 public voidonPrepared(MediaPlayer mp) {71 player.start();72 addTimer();73

74 }75 });76 } catch(Exception e) {77 e.printStackTrace();78 }79

80 }81

82 public voidcontinuePlay() {83 System.out.println("继续播放");84 player.start();85 }86

87 public voidpause() {88 System.out.println("暂停");89 player.pause();90 }91

92 public voidstop() {93 System.out.println("停止");94 player.stop();95 player.release();96 player = null;97 if (timer!=null) {98 timer.cancel();99 timer=null;100 }101 }102

103 public void seekTo(intprogress){104 player.seekTo(progress);105 }106

107 public voidaddTimer() {108 //播放进度需要不停的获取,不停的刷新进度条,使用计时器每1000毫秒获取一次播放进度109 //发消息至Handler,把播放进度放进Message对象中,在Handler中更新SeekBar的进度

110 if (timer == null) {111

112 timer = newTimer();113 timer.schedule(newTimerTask() {114

115 @Override116 public voidrun() {117 //获取到歌曲总时长

118 int duration =player.getDuration();119 //获取歌曲当前进度

120 int currentPosition =player.getCurrentPosition();121 Message msg =MainActivity.handler.obtainMessage();122 Bundle bundle = newBundle();123 bundle.putInt("duration", duration);124 bundle.putInt("currentPosition", currentPosition);125 msg.setData(bundle);126 MainActivity.handler.sendMessage(msg);127

128 }129 }, 5, 1000);130 }131

132 }133

134 }

把MusicControl类抽取出来为接口,这样可以在MainActivity中只可以访问接口的方法,MusicControl类中的其他方法不被方法

MusicInterface:

1 public interfaceMusicInterface {2

3 voidplay();4 voidcontinuePlay();5 voidstop();6 voidpause();7 void seekTo(intprogress);8

9 }

android seekto实现_Android开发之音乐播放器的实现相关推荐

  1. Android开发之音乐播放器所遇到的问题

    首先,我先声明一下:我的Android Studio是最新版的(2019.11.16) 我要说的是在Android Studio创建一个音乐播放器所遇到的问题 我借鉴的是<Android移动开发 ...

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

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

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

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

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

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

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

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

  6. .net vue漂亮登录界面_基于 electron-vue 开发的音乐播放器「实践」

    作者:XiaoTuGou 转发链接:https://github.com/SmallRuralDog 前言 基于 electron-vue 开发的音乐播放器,界面模仿QQ音乐. 技术栈electron ...

  7. iOS开发:音乐播放器

    /******************       iOS开发:音乐播放器     *****************/ 要求:给button一个触发事件,点击一下播放歌曲,显示暂停提示: 再点击一下 ...

  8. 微信PHP开发《音乐播放器》

    文章目录 前言 一.简介 二.引入Vant框架 1.引入库 2.需要用到的知识 三.页面编写,以及js的实现 1.首页 2.搜索页 3.获取搜索歌曲 4.播放页 5.榜单列表页 6.对应页面的json ...

  9. 使用树莓派3B+开发智能音乐播放器

    使用树莓派3B+开发智能音乐播放器 2018年07月03日 21:25:13 qq_42044484 阅读数:2397 一.功能描述 对麦克风说出歌名后,树莓派自动下载对应歌曲的MP3,默认播放搜索到 ...

最新文章

  1. AAAI2018正式落幕 13个世界顶尖AI教授都讲了啥?
  2. STL algorithm算法merge(34)
  3. 中医科学院临基所携手第四范式助力抗疫工作
  4. [react] super()和super(props)有什么区别?
  5. LeetCode 1973. Count Nodes Equal to Sum of Descendants(DFS)
  6. Cowrie蜜罐的部署(ubt亲测)
  7. uva 436 Arbitrage (II)
  8. cannot load such file -- readline
  9. “过早的性能优化是魔鬼”
  10. 二扩域元素与整数的转换
  11. SQL语言:DQL,DML,DDL,DCL
  12. Windows中下载并安装RabbitMQ
  13. java jpg转png 模糊_Java JPG转换为Png
  14. 1299最长上升子序列
  15. 使用bootstrap写一个注册页面
  16. java中 字符串的补位
  17. 华硕主板反复进入BIOS以及无法识别固态硬盘?
  18. 基于Android的期刊投稿网站的设计与开发
  19. 计算机练打字最难的一段话,电脑盲打字一般练多久 你用多久练会了盲打?
  20. uni-app微信公众号登录

热门文章

  1. 基于卡方的独立性检验
  2. 我的2018:自由职业的冰火两重天
  3. iOS 图标alpha问题
  4. 读书笔记3——《如何高效学习》:斯科特·扬
  5. android开发自定义键盘,Android 总结:自定义键盘实现原理和三种实例详解
  6. CSS之vertical-align之野史篇(超越官网的教程)
  7. 20 多个国外优秀Android开源 App
  8. OPCUA标准java实现 Milo库
  9. 12.4.1 索引顺序存取方法文件 / ISAM文件
  10. test\fmw\gtest\include\gtest/gtest-printers.h(714) : error C2977: “std::tuple”: 模板 参数太多