实现音乐播放器

音乐播放器

   首先声明一下,本例是直接采用课本中范例122的方法。

1、activity_main.xml布局

 1 <TextView
 2          android:layout_width="fill_parent"
 3          android:layout_height="wrap_content"
 4          android:text="music"
 5       />
 6 //四个按钮
 7     <LinearLayout
 8         android:layout_width="fill_parent"
 9         android:layout_height="wrap_content"
10         android:orientation="horizontal">
11 // 上一首
12      <Button
13          android:id="+id/previous"
14          android:layout_width="wrap_content"
15          android:layout_height="fill_parent"
16          android:layout_weight="1"
17          android:text="上一首"
18       />
19 // 播放
20      <Button
21          android:id="+id/play"
22          android:layout_width="wrap_content"
23          android:layout_height="fill_parent"
24          android:layout_weight="1"
25          android:text="播放"
26       />
27 //下一首
28      <Button
29          android:id="+id/next"
30          android:layout_width="wrap_content"
31          android:layout_height="fill_parent"
32          android:layout_weight="1"
33          android:text="下一首"
34       />
35 <!-- 暂停 -->
36      <Button
37          android:id="+id/pause"
38          android:layout_width="wrap_content"
39          android:layout_height="fill_parent"
40          android:layout_weight="1"
41          android:text="暂停"
42       />
43      </LinearLayout>

基本布局

2、MainAxtivity.java

  (1)定义四个按钮

  (2)绑定相应的监听对象

  (3)传递不同点击参数

代码如下:

 1 public class MainActivity extends Activity implements OnClickListener {
 2         //初始化控件
 3     private Button mBtnPrevious; // 上一首
 4     private Button mBtnPlay; // 播放
 5     private Button mBtnNext; // 下一首
 6     private Button mBtnPause; // 暂停
 7     private ComponentName component; // 用于启动服务
 8
 9     public void onCreate(Bundle savedInstanceState) {
10         super.onCreate(savedInstanceState);
11         setContentView(R.layout.activity_main);
12         // 得到布局中的控件
13         findView();
14         // 绑定控件事件
15         setListener();
16     }
17
18     // 得到布局中的控件
19     private void findView() {
20         component = new ComponentName(this, MusicService.class);
21         mBtnPrevious = (Button) findViewById(R.id.previous);
22         mBtnPlay = (Button) findViewById(R.id.play);
23         mBtnNext = (Button) findViewById(R.id.next);
24         mBtnPause = (Button) findViewById(R.id.pause);
25     }
26     // 绑定控件事件
27     private void setListener() {
28         mBtnPrevious.setOnClickListener(this);
29         mBtnPlay.setOnClickListener(this);
30         mBtnNext.setOnClickListener(this);
31         mBtnPause.setOnClickListener(this);
32     }
33     // 按钮点击事件响应
34     public void onClick(View v) {
35         // 如果点击前一首歌,就在intent中传递前一首歌参数
36         if (v == mBtnPrevious) {
37             Intent mIntent = new Intent(MusicService.PREVIOUS_ACTION);
38             mIntent.setComponent(component);
39             startService(mIntent);
40         // 如果点击前播放歌曲,就在intent中传递播放当前歌参数
41         } else if (v == mBtnPlay) {
42             Intent mIntent = new Intent(MusicService.PLAY_ACTION);
43             mIntent.setComponent(component);
44             startService(mIntent);
45         // 如果点击前一首歌,就在intent中传递下一首歌参数
46         } else if (v == mBtnNext) {
47             Intent mIntent = new Intent(MusicService.NEXT_ACTION);
48             mIntent.setComponent(component);
49             startService(mIntent);
50         // 如果点击前一首歌,就在intent中传递暂停首歌参数
51         } else {
52             Intent mIntent = new Intent(MusicService.PAUSE_ACTION);
53             mIntent.setComponent(component);
54             startService(mIntent);
55         }
56     }
57 }

主要代码

3、自定义Service类

    (1)获取音频数据的字段名称

     (2) 初始化MediaPlayer对象

    (3)通过getContentResolver得到系统中所有音乐,只获取播放时间在10秒以上的音乐

    (4)onStart方法中判断得到的intent中的参数,调用相应方法

    (5)分别定义音乐的播放、暂停、前一首、下一首的实现内容

代码如下:

  1 //定义音乐服务类
  2 public class MusicService extends Service {
  3     // 定义需要显示的音乐的字段
  4     String[] mCursorCols = new String[] {
  5             "audio._id AS _id", // index must match IDCOLIDX below
  6             MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM,
  7             MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DATA,
  8             MediaStore.Audio.Media.MIME_TYPE, MediaStore.Audio.Media.ALBUM_ID,
  9             MediaStore.Audio.Media.ARTIST_ID, MediaStore.Audio.Media.DURATION };
 10     private MediaPlayer mMediaPlayer; // 声明播放器
 11     private Cursor mCursor; // 声明游标
 12     private int mPlayPosition = 0; // 当前播放的歌曲
 13
 14     // 注册意图
 15     public static final String PLAY_ACTION = "com.wyl.music.PLAY_ACTION";
 16     public static final String PAUSE_ACTION = "com.wyl.music.PAUSE_ACTION";
 17     public static final String NEXT_ACTION = "com.wyl.music.NEXT_ACTION";
 18     public static final String PREVIOUS_ACTION = "com.wyl.music.PREVIOUS_ACTION";
 19
 20     @Override
 21     public IBinder onBind(Intent arg0) {
 22         return null;
 23     }
 24
 25     @Override
 26     public void onCreate() {
 27         super.onCreate();
 28         mMediaPlayer = new MediaPlayer();
 29         Uri MUSIC_URL = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;// 通过一个URI可以获取所有音频文件
 30         //默认大于10秒的可以看作是系统音乐
 31         mCursor = getContentResolver().query(MUSIC_URL, mCursorCols,
 32                 "duration > 10000", null, null);
 33     }
 34
 35     @Override
 36     public void onStart(Intent intent, int startId) {
 37         super.onStart(intent, startId);
 38         // 根据不同的action,做不同的相应
 39         String action = intent.getAction();
 40         //播放
 41         if (action.equals(PLAY_ACTION)) {
 42             play();
 43         //暂停
 44         } else if (action.equals(PAUSE_ACTION)) {
 45             pause();
 46         //下一首
 47         } else if (action.equals(NEXT_ACTION)) {
 48             next();
 49         //前一首
 50         } else if (action.equals(PREVIOUS_ACTION)) {
 51             previous();
 52         }
 53     }
 54
 55     // 播放音乐
 56     public void play() {
 57         //初始化音乐播放器
 58         inite();
 59     }
 60
 61     // 暂停时,结束服务
 62     public void pause() {
 63         //暂停音乐播放
 64         stopSelf();
 65     }
 66
 67     // 上一首
 68     public void previous() {
 69         //得到前一首的歌曲
 70         if (mPlayPosition == 0) {
 71             mPlayPosition = mCursor.getCount() - 1;
 72         } else {
 73             mPlayPosition--;
 74         }
 75         //开始播放
 76         inite();
 77     }
 78
 79     // 下一首
 80     public void next() {
 81         //得到后一首歌曲
 82         if (mPlayPosition == mCursor.getCount() - 1) {
 83             mPlayPosition = 0;
 84         } else {
 85             mPlayPosition++;
 86         }
 87         //开始播放
 88         inite();
 89     }
 90
 91     // 初始化播放器
 92     public void inite() {
 93         //充值MediaPlayer
 94         mMediaPlayer.reset();
 95         // 获取歌曲位置
 96         String dataSource = getDateByPosition(mCursor, mPlayPosition);
 97         // 歌曲信息
 98         String info = getInfoByPosition(mCursor, mPlayPosition);
 99         // 用Toast显示歌曲信息
100         Toast.makeText(getApplicationContext(), info, Toast.LENGTH_SHORT)
101                 .show();
102         try {
103             // 播放器绑定资源
104             mMediaPlayer.setDataSource(dataSource);
105             // 播放器准备
106             mMediaPlayer.prepare();
107             // 播放
108             mMediaPlayer.start();
109         } catch (IllegalArgumentException e1) {
110             e1.printStackTrace();
111         } catch (IllegalStateException e1) {
112             e1.printStackTrace();
113         } catch (IOException e1) {
114             e1.printStackTrace();
115         }
116     }
117
118     // 根据位置来获取歌曲位置
119     public String getDateByPosition(Cursor c, int position) {
120         c.moveToPosition(position);
121         int dataColumn = c.getColumnIndex(MediaStore.Audio.Media.DATA);
122         String data = c.getString(dataColumn);
123         return data;
124     }
125
126     // 获取当前播放歌曲演唱者及歌名
127     public String getInfoByPosition(Cursor c, int position) {
128         c.moveToPosition(position);
129         int titleColumn = c.getColumnIndex(MediaStore.Audio.Media.TITLE);
130         int artistColumn = c.getColumnIndex(MediaStore.Audio.Media.ARTIST);
131         String info = c.getString(artistColumn) + " "
132                 + c.getString(titleColumn);
133         return info;
134
135     }
136
137     // 服务结束时要释放MediaPlayer
138     public void onDestroy() {
139         super.onDestroy();
140         mMediaPlayer.release();
141     }
142 }

音乐服务类

播放器完成!在此之后会更新其他方式完成的音乐播放器。

时间: 2024-10-13 11:02:03

实现音乐播放器的相关文章

Android实现音乐播放器(一)

Graphical User Interface 本篇文章记录了我实现Android简单音乐播放器的过程,(一)中介绍了怎么构建音乐播放器的前端页面.首先大家看一下,界面最后是这样的(界面有点粗陋) 音乐文件列表是从SD卡中读取出来的. 首先我们先在Layout里面创建Music Player的GUI,diagram如下图所示: 根据diagram我们在activity_main.xml写出如下代码: <LinearLayout xmlns:android="http://schemas.

手把手教你做音乐播放器(八)桌面小工具(上)

第8节 桌面小工具 桌面小工具是可以放置在主界面的.快速控制应用的小助手.例如我们的音乐小工具,它可以帮助用户在桌面上就完成音乐的暂停.播放.切换等操作,而不需要启动应用本身. 在安卓系统中,我们也常常叫它App widget. 实现一个App widget要经过以下几个步骤, 创建一个App widget类,让它继承自AppWidgetProvider,例如AnddleMusicAppWidget类: 放在res\layout目录下,为App widget的界面定义一个布局,例如anddle_

毕业设计——基于STM32的音乐播放器设计(一)

基于STM32的音乐播放器设计, 源代码下载地址:http://download.csdn.net/detail/cxp2205455256/8334021      SD卡文件下载地址:http://download.csdn.net/detail/cxp2205455256/8334089 电路图下载地址:文件太大了,上传不了....... 以下是截图: 1.硬件电路 2.软件主界面 3.音乐播放器界面 4.音乐定时播放界面 5.音乐列表界面 6.日历功能界面 9.温度功能界面 10.计算器

Xamarin.Android开发音乐播放器

最近.Net开源着实让C#火了一把,好久就听说Mono for Android一直没静下心来看,上周末找来看看,确实不错,前台界面axml编写跟Java安卓开发毫无区别,后台用C#其实很多windows下的方法都可以用,做一个安卓音乐播放器,主要实现音乐播放,上一曲下一曲,音乐播放列表,随机播放,扫描SD卡内所有音乐. 先show一组界面啊,话说有图有真相啊: 项目结构如图: Lrc是歌词处理方法 MusicService是安卓服务播放音乐,服务Broadcast,以及界面接收Receiver

html网页音乐播放器自带播放列表

基于网页的音乐播放器demo  http://pan.baidu.com/s/1dDgm7HR 自己diy了一个手机端在线音乐播放器演示地址http://shanxi2014.com/zhuandizhi/dom.php 全面支持手机端浏览器. 主要修改引用路径(不要修改文件相对存放地址) 第二就是正则拼接参数了 <script src="/city/js/libs/jquery-1.10.2.min.js"></script> <script src=&

【源码分享】mui实现简单的手机音乐播放器

mui实现简单的手机音乐播放器 最近先来无事,我用mui写了一个可以跨页面控制的音乐播放器.主要功能有上一曲,下一曲,播放,暂停,感兴趣的可以继续看下去. 说的总是不实在,直接上源码,有兴趣的可以读下注释. 1首页代码 ①首页的html代码 1 <a> 2 <i id="bofang" class="iconfont icon-play-o"></i> <!--就是一个播放按钮没啥特殊的--> 3 </a>

HTML5项目笔记4:使用Audio API设计绚丽的HTML5音乐播放器

HTML5 有两个很炫的元素,就是Audio和 Video,可以用他们在页面上创建音频播放器和视频播放器,制作一些效果很不错的应用. 无论是视屏还是音频,都是一个容器文件,包含了一些音频轨道,视频轨道和一些元数据,这些是和你的视频或者音频控件绑定到一块的,这样才形成了一个完整的播放组件. 浏览器支持情况: 浏览器 支持情况 编解码器 Chrome 3.0 Theora . Vorbis .Ogg H.264 . AAC .MPEG4 FireFox 3.5 Theora . Vorbis .Og

web音乐播放器

今天闲暇时间,花了2小时,写了个简单音乐播放器.欢迎大家来吐糟 先看下界面截图 大体实现:播放,停止,上一曲,下一曲,循环播放功能. 知识点:1.html 中audio 2.css 位置fixed 其中audio用到的方法:1.play 2.pause ,属性:1.src 2.loop 对于audio不熟悉的移步到http://www.w3school.com.cn/jsref/dom_obj_audio.asp 其中数据部分是在网上找了的保存在listrings.js中 下边关键时刻代码来了

用PHP+H5+Boostrap做简单的音乐播放器(进阶版)

前言:之前做了一个音乐播放器(纯前端),意外的受欢迎,然后有人建议我把后台一起做了,正好也想学习后台,所以学了两天php(不要吐槽我的速度,慢工出细活嘛~)然后在之前的基础上也又完善了一些功能,所以这个Demo比之前的可以算是进阶呢~v2.0哈哈哈~感觉截图体验很不好呢,所以在美图秀秀上面做了简易的动图,大家感受感受 正文: 老规矩,先上图~感觉有点卡,愿意等的就等等嘛,不愿意等的,往下看,有图片讲解 功能实现: 1.点击音乐列表播放音乐 2.拖动或点击进度条,调节音乐播放进度 3.浮动到音量控

用H5+Boostrap做简单的音乐播放器

用H5+Boostrap做简单的音乐播放器 前言:这个是综合一下我最近在学的东西做的小Demo,到实际使用还有距离,但是用来练手巩固知识点还是不错的,最近在二刷JS书和Boostrap.css的源码,做完这个Demo也算是暂告一段落,接下来是jQuery的源码和Boostrap.js的源码,任务很艰巨呢,加油~在此就不整篇的贴代码了,如果感兴趣的小伙伴可以发消息给我,可以把代码传给你们~ 正文: 先上效果图 1.布局:Boostrap里的响应式和自适应布局是自然跑不掉的,container中嵌套