简单带进度条的音乐播放器

  1 import java.text.SimpleDateFormat;
  2 import java.util.Date;
  3 import android.app.Activity;
  4 import android.app.LoaderManager.LoaderCallbacks;
  5 import android.content.BroadcastReceiver;
  6 import android.content.Context;
  7 import android.content.CursorLoader;
  8 import android.content.Intent;
  9 import android.content.IntentFilter;
 10 import android.content.Loader;
 11 import android.database.Cursor;
 12 import android.net.Uri;
 13 import android.os.Bundle;
 14 import android.provider.MediaStore;
 15 import android.support.v4.content.LocalBroadcastManager;
 16 import android.util.Log;
 17 import android.view.View;
 18 import android.widget.AdapterView;
 19 import android.widget.AdapterView.OnItemClickListener;
 20 import android.widget.Button;
 21 import android.widget.ListView;
 22 import android.widget.SeekBar;
 23 import android.widget.SimpleCursorAdapter;
 24 import android.widget.TextView;
 25
 26 public class MainActivity extends Activity {
 27
 28     private Button stopBtn, playBtn;
 29     private boolean isPlaying=false;
 30
 31     private Intent playerIntent; //播放服务组件的意图对象
 32
 33     private SeekBar seekBar; //可拖动的进度控件,用于显示播放的进度
 34
 35     private PrgReceiver prgReceiver;
 36
 37     private LocalBroadcastManager lbMgr;
 38
 39     private TextView msgTv; //格式化显示当前播放的时间与总时间
 40
 41     private Uri mp3Uri=MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; //获取扩展卡下的所有的音频文件接口
 42     private String[] columns={MediaStore.Audio.Media._ID,
 43                                     MediaStore.Audio.Media.DISPLAY_NAME, //文件名
 44                                     MediaStore.Audio.Media.DATA,//文件路径
 45                                     MediaStore.Audio.Media.DURATION};  //总时长
 46     private ListView listView;
 47     private SimpleCursorAdapter adapter;
 48
 49     @Override
 50     protected void onCreate(Bundle savedInstanceState) {
 51         super.onCreate(savedInstanceState);
 52         setContentView(R.layout.activity_main);
 53
 54         playBtn = (Button) findViewById(R.id.btn1Id);
 55         stopBtn = (Button) findViewById(R.id.btn2Id);
 56
 57         seekBar=(SeekBar) findViewById(R.id.seekBarId);
 58         msgTv=(TextView) findViewById(R.id.msgId);
 59
 60         playerIntent=new Intent(getApplicationContext(),PlayerService.class);
 61
 62         lbMgr=LocalBroadcastManager.getInstance(getApplicationContext());
 63
 64         prgReceiver=new PrgReceiver();
 65         lbMgr.registerReceiver(prgReceiver, new IntentFilter(Config.ACTION_PROGRESS));
 66
 67         event();
 68
 69         initMp3List(); //初始显示mp3列表相关的控件
 70     }
 71
 72
 73     private SimpleDateFormat sdf=new SimpleDateFormat("mm:ss");
 74     private void initMp3List() {
 75         // TODO Auto-generated method stub
 76         listView=(ListView) findViewById(R.id.listViewId);
 77         adapter=new SimpleCursorAdapter(getApplicationContext()
 78                 ,R.layout.item_audio,null,
 79                 new String[]{columns[1],columns[3],columns[2]},
 80                 new int[]{R.id.nameId,R.id.timeId,R.id.pathId},
 81                 SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER){
 82
 83             @Override
 84             public void setViewText(TextView v, String text) {//设置文本控件内容的方法
 85                 super.setViewText(v, text);
 86
 87                 Log.i("info", "text:"+text);
 88                 if(v.getId()==R.id.timeId){
 89                     long time=Long.parseLong(text);
 90                     v.setText(sdf.format(new Date(time)));
 91                 }
 92             }
 93         };
 94
 95
 96
 97         listView.setAdapter(adapter);
 98
 99         //初始化启动Loader,加载扩展卡下所有音频文件
100         getLoaderManager().initLoader(1, null, new LoaderCallbacks<Cursor>() {
101
102             @Override
103             public Loader<Cursor> onCreateLoader(int id, Bundle args) {
104
105                 return new CursorLoader(getApplicationContext(),mp3Uri,columns,null,null,null);
106             }
107
108             @Override
109             public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
110                 adapter.swapCursor(data);//适配器切换数据源
111             }
112
113             @Override
114             public void onLoaderReset(Loader<Cursor> loader) {
115                 // TODO Auto-generated method stub
116
117             }
118         });
119
120         //设置ListView中item的点击事件
121         listView.setOnItemClickListener(new OnItemClickListener() {
122             @Override
123             public void onItemClick(AdapterView<?> parent, View view,
124                     int position, long id) {
125                 // TODO 点击某一文件的item事件,获取文件名和文件的路径
126                 Cursor cursor=adapter.getCursor();
127                 cursor.moveToPosition(position);
128
129                 String name=cursor.getString(1);//获取第2列的信息,即文件名
130                 String path=cursor.getString(2);//获取第3列的信息,即文件路径
131
132                 Log.i("info", name+","+path);
133
134                 playerIntent.putExtra(Config.EXTRA_CHANGE, true);
135                 playerIntent.putExtra(Config.EXTRA_PATH, path);
136
137                 startService(playerIntent);
138
139                 playBtn.setText("暂停");
140
141             }
142         });
143
144     }
145
146     private void event() {
147         // TODO Auto-generated method stub
148         seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
149
150             @Override
151             public void onStopTrackingTouch(SeekBar seekBar) {
152                 // TODO 拖动结束时的方法
153                 //获取当前拖动的位置
154                 int seekPosition=seekBar.getProgress();
155
156                 //向播放组件组件发送广播
157                 Intent intent=new Intent(Config.ACTION_SEEKTO);
158                 intent.putExtra(Config.EXTRA_PROGREES_CUR, seekPosition);
159
160                 lbMgr.sendBroadcast(intent);//发送广播(在Service组件内接收)
161             }
162
163             @Override
164             public void onStartTrackingTouch(SeekBar seekBar) {
165                 // TODO Auto-generated method stub
166
167             }
168
169             @Override
170             public void onProgressChanged(SeekBar seekBar, int progress,
171                     boolean fromUser) {
172                 // TODO Auto-generated method stub
173
174             }
175         });
176     }
177
178     public void play(View v) { //播放或暂停
179
180         playerIntent.putExtra(Config.EXTRA_CHANGE, false);
181         startService(playerIntent);
182
183         isPlaying=!isPlaying;
184
185         if(isPlaying){
186             playBtn.setText("暂停");
187         }else{
188             playBtn.setText("播放");
189         }
190     }
191
192     public void stop(View v) { //停止
193         stopService(playerIntent);
194         seekBar.setProgress(0);
195         msgTv.setText("00:00/00:00");//=------------------------
196
197         playBtn.setText("播放");
198
199     }
200
201     @Override
202     protected void onDestroy() {
203         super.onDestroy();
204
205         lbMgr.unregisterReceiver(prgReceiver);//取消注册本地广播接收器
206     }
207
208     private String formatTime(int s){
209         StringBuilder builder=new StringBuilder();
210
211         int m=s/60; //获取分钟
212         s=s%60; //获取秒数
213
214         builder.append(m/10).append(m%10)
215                .append(":")
216                .append(s/10).append(s%10);
217
218         return builder.toString();
219     }
220
221     class PrgReceiver extends BroadcastReceiver{
222         @Override
223         public void onReceive(Context context, Intent intent) {
224             // TODO 接收播放服务组件中发送的进度广播
225             int max=intent.getIntExtra(Config.EXTRA_PROGREES_MAX,0);
226             int cur=intent.getIntExtra(Config.EXTRA_PROGREES_CUR,0);
227
228             seekBar.setMax(max);
229             seekBar.setProgress(cur);
230
231             msgTv.setText(formatTime(cur/1000)+"/"+formatTime(max/1000));
232         }
233     }
234
235 }

MainActivity.java

  1 import java.text.SimpleDateFormat;
  2 import java.util.Date;
  3 import android.app.Activity;
  4 import android.app.LoaderManager.LoaderCallbacks;
  5 import android.content.BroadcastReceiver;
  6 import android.content.Context;
  7 import android.content.CursorLoader;
  8 import android.content.Intent;
  9 import android.content.IntentFilter;
 10 import android.content.Loader;
 11 import android.database.Cursor;
 12 import android.net.Uri;
 13 import android.os.Bundle;
 14 import android.provider.MediaStore;
 15 import android.support.v4.content.LocalBroadcastManager;
 16 import android.util.Log;
 17 import android.view.View;
 18 import android.widget.AdapterView;
 19 import android.widget.AdapterView.OnItemClickListener;
 20 import android.widget.Button;
 21 import android.widget.ListView;
 22 import android.widget.SeekBar;
 23 import android.widget.SimpleCursorAdapter;
 24 import android.widget.TextView;
 25
 26 public class MainActivity extends Activity {
 27
 28     private Button stopBtn, playBtn;
 29     private boolean isPlaying=false;
 30
 31     private Intent playerIntent; //播放服务组件的意图对象
 32
 33     private SeekBar seekBar; //可拖动的进度控件,用于显示播放的进度
 34
 35     private PrgReceiver prgReceiver;
 36
 37     private LocalBroadcastManager lbMgr;
 38
 39     private TextView msgTv; //格式化显示当前播放的时间与总时间
 40
 41     private Uri mp3Uri=MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; //获取扩展卡下的所有的音频文件接口
 42     private String[] columns={MediaStore.Audio.Media._ID,
 43                                     MediaStore.Audio.Media.DISPLAY_NAME, //文件名
 44                                     MediaStore.Audio.Media.DATA,//文件路径
 45                                     MediaStore.Audio.Media.DURATION};  //总时长
 46     private ListView listView;
 47     private SimpleCursorAdapter adapter;
 48
 49     @Override
 50     protected void onCreate(Bundle savedInstanceState) {
 51         super.onCreate(savedInstanceState);
 52         setContentView(R.layout.activity_main);
 53
 54         playBtn = (Button) findViewById(R.id.btn1Id);
 55         stopBtn = (Button) findViewById(R.id.btn2Id);
 56
 57         seekBar=(SeekBar) findViewById(R.id.seekBarId);
 58         msgTv=(TextView) findViewById(R.id.msgId);
 59
 60         playerIntent=new Intent(getApplicationContext(),PlayerService.class);
 61
 62         lbMgr=LocalBroadcastManager.getInstance(getApplicationContext());
 63
 64         prgReceiver=new PrgReceiver();
 65         lbMgr.registerReceiver(prgReceiver, new IntentFilter(Config.ACTION_PROGRESS));
 66
 67         event();
 68
 69         initMp3List(); //初始显示mp3列表相关的控件
 70     }
 71
 72
 73     private SimpleDateFormat sdf=new SimpleDateFormat("mm:ss");
 74     private void initMp3List() {
 75         // TODO Auto-generated method stub
 76         listView=(ListView) findViewById(R.id.listViewId);
 77         adapter=new SimpleCursorAdapter(getApplicationContext()
 78                 ,R.layout.item_audio,null,
 79                 new String[]{columns[1],columns[3],columns[2]},
 80                 new int[]{R.id.nameId,R.id.timeId,R.id.pathId},
 81                 SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER){
 82
 83             @Override
 84             public void setViewText(TextView v, String text) {//设置文本控件内容的方法
 85                 super.setViewText(v, text);
 86
 87                 Log.i("info", "text:"+text);
 88                 if(v.getId()==R.id.timeId){
 89                     long time=Long.parseLong(text);
 90                     v.setText(sdf.format(new Date(time)));
 91                 }
 92             }
 93         };
 94
 95
 96
 97         listView.setAdapter(adapter);
 98
 99         //初始化启动Loader,加载扩展卡下所有音频文件
100         getLoaderManager().initLoader(1, null, new LoaderCallbacks<Cursor>() {
101
102             @Override
103             public Loader<Cursor> onCreateLoader(int id, Bundle args) {
104
105                 return new CursorLoader(getApplicationContext(),mp3Uri,columns,null,null,null);
106             }
107
108             @Override
109             public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
110                 adapter.swapCursor(data);//适配器切换数据源
111             }
112
113             @Override
114             public void onLoaderReset(Loader<Cursor> loader) {
115                 // TODO Auto-generated method stub
116
117             }
118         });
119
120         //设置ListView中item的点击事件
121         listView.setOnItemClickListener(new OnItemClickListener() {
122             @Override
123             public void onItemClick(AdapterView<?> parent, View view,
124                     int position, long id) {
125                 // TODO 点击某一文件的item事件,获取文件名和文件的路径
126                 Cursor cursor=adapter.getCursor();
127                 cursor.moveToPosition(position);
128
129                 String name=cursor.getString(1);//获取第2列的信息,即文件名
130                 String path=cursor.getString(2);//获取第3列的信息,即文件路径
131
132                 Log.i("info", name+","+path);
133
134                 playerIntent.putExtra(Config.EXTRA_CHANGE, true);
135                 playerIntent.putExtra(Config.EXTRA_PATH, path);
136
137                 startService(playerIntent);
138
139                 playBtn.setText("暂停");
140
141             }
142         });
143
144     }
145
146     private void event() {
147         // TODO Auto-generated method stub
148         seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
149
150             @Override
151             public void onStopTrackingTouch(SeekBar seekBar) {
152                 // TODO 拖动结束时的方法
153                 //获取当前拖动的位置
154                 int seekPosition=seekBar.getProgress();
155
156                 //向播放组件组件发送广播
157                 Intent intent=new Intent(Config.ACTION_SEEKTO);
158                 intent.putExtra(Config.EXTRA_PROGREES_CUR, seekPosition);
159
160                 lbMgr.sendBroadcast(intent);//发送广播(在Service组件内接收)
161             }
162
163             @Override
164             public void onStartTrackingTouch(SeekBar seekBar) {
165                 // TODO Auto-generated method stub
166
167             }
168
169             @Override
170             public void onProgressChanged(SeekBar seekBar, int progress,
171                     boolean fromUser) {
172                 // TODO Auto-generated method stub
173
174             }
175         });
176     }
177
178     public void play(View v) { //播放或暂停
179
180         playerIntent.putExtra(Config.EXTRA_CHANGE, false);
181         startService(playerIntent);
182
183         isPlaying=!isPlaying;
184
185         if(isPlaying){
186             playBtn.setText("暂停");
187         }else{
188             playBtn.setText("播放");
189         }
190     }
191
192     public void stop(View v) { //停止
193         stopService(playerIntent);
194         seekBar.setProgress(0);
195         msgTv.setText("00:00/00:00");//=------------------------
196
197         playBtn.setText("播放");
198
199     }
200
201     @Override
202     protected void onDestroy() {
203         super.onDestroy();
204
205         lbMgr.unregisterReceiver(prgReceiver);//取消注册本地广播接收器
206     }
207
208     private String formatTime(int s){
209         StringBuilder builder=new StringBuilder();
210
211         int m=s/60; //获取分钟
212         s=s%60; //获取秒数
213
214         builder.append(m/10).append(m%10)
215                .append(":")
216                .append(s/10).append(s%10);
217
218         return builder.toString();
219     }
220
221     class PrgReceiver extends BroadcastReceiver{
222         @Override
223         public void onReceive(Context context, Intent intent) {
224             // TODO 接收播放服务组件中发送的进度广播
225             int max=intent.getIntExtra(Config.EXTRA_PROGREES_MAX,0);
226             int cur=intent.getIntExtra(Config.EXTRA_PROGREES_CUR,0);
227
228             seekBar.setMax(max);
229             seekBar.setProgress(cur);
230
231             msgTv.setText(formatTime(cur/1000)+"/"+formatTime(max/1000));
232         }
233     }
234
235 }

PlayerService.java

时间: 2025-01-17 10:44:09

简单带进度条的音乐播放器的相关文章

iOS音乐播放器(歌词自动滚动)

简单实现基于IOS的音乐播放器,并且带有歌词,随播放自动滚动,实现效果如下: 首先,需要建立一个解析歌词的类ZMPlrc,解析歌词主要就是把时间和对应的歌词分离出来,然后存储到数组中. ZMPlrc.h #import <Foundation/Foundation.h> @interface ZMPlrc : NSObject /** 时间 */ @property (nonatomic,strong)NSMutableArray *timeArray; /** 歌词 */ @property

音乐播放器(支持本地搜索,字母检索,进度条控制,后台来电控制音乐)

音乐播放器(支持本地搜索,字母检索,进度条控制,后台来电控制音乐) 自己做的一个简单的音乐播放器,ViewPager+ListView布局. 下载地址:http://www.devstore.cn/code/info/541.html 运行截图:   版权声明:本文为博主原创文章,未经博主允许不得转载.

MediaPlayer音乐播放器、上一首、下一首、播放、停止、自动下一首、进度条

本文介绍MediaPlayer的使用.MediaPlayer可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用MediaPlayer,要视情况选择了.MediaPlayer播放音频比较简单,但是要播放视频就需要SurfaceView.SurfaceView比普通的自定义View更有绘图上的优势,它支持完全的OpenGL ES库. 先贴出本文程序运行结果的截图,下面是上一首.下一首.播放.停止.自动下一首.可用Se

基于Jquery的音乐播放器进度条插件

自己基于豆瓣FM的ui仿写qq音乐时,基于Jquery手写的进度条插件,效果图如下: 主要特色: ① 可自适应挂载元素的宽度,也可以自己设置进度条宽度: ② 支持部分默认参数修改(具体见使用说明): ③ 允许最大时间为23:59:59,高于此值将默认修改为此值: ④ 可以自己控制进度条动画的开关及重置: ⑤ 可以获取进度条当前时间和宽度,与H5的audio标签协调使用. 使用说明: /* * 功能描述:播放器进度条 * 参数: * option:挂载父元素 * inTime:进度条时间长度 *

React Native (一) react-native-video实现音乐播放器和进度条的功能

React Native (一) react-native-video实现音乐播放器和进度条的功能 功能: 1.卡片滑动切歌 2.显示进度条 效果图: 第三方组件: 1.react-native-video Github地址:https://github.com/react-native-community/react-native-video 2.react-native-animated-tabs Github地址:https://github.com/philipshurpik/react

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

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

Android开发实战之简单音乐播放器

最近开始学习音频相关.所以,很想自己做一个音乐播放器,于是,花了一天学习,将播放器的基本功能实现了出来.我觉得学习知识点还是蛮多的,所以写篇博客总结一下关于一个音乐播放器实现的逻辑.希望这篇博文对你的学习和生活有所帮助.效果图: **实现逻辑** 在市面上的音乐播放app,即时你关了.那么一样会在后台播放,所以播放的逻辑应该写在Service中.并且能够实现Service和Activity之间进行通信.那么Service是四大组件之一,所以在使用的时候一定不要忘了在配置文件中声明一下. <ser

iOS 简单实用的音乐播放器,少年,自己做个歌单吧。。。。。。

我也不知道为什么突然会想写一下音乐播放器的,感觉应该挺好的玩,自己把自己喜欢的歌曲导出来,用程序加载跑 起来,那歌听起来必定很带感啊......不过那首Love Story被我听了无数遍......听吐了 各位看官有兴趣也可以听听.其实前期准备是很坑爹的,找歌词真的蛋疼啊. 废话不多说,老规矩,看成品先: 尼玛这东西占得空间太大了,录不了太多...... 先介绍吧 首先 做个播放器的界面出来,上面是个tableView来加载歌词,底部两个Slider,一个声音,一个进度,最底下三个Button.

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

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