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

  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

 

转载于:https://www.cnblogs.com/bimingcong/p/4822186.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
音频播放实现暂停开始等 }); btnStop.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub musicStop(); } }); player.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { // TODO Auto-generated method stub if(currentPlayMusicNum<musicList.size()){ currentPlayMusicNum+=1; }else{ currentPlayMusicNum=0; } musicStart(currentPlayMusicNum); } }); lvShowMusicList.setOnItemClickListener(new OnItemClickListener() { @SuppressLint("ResourceAsColor") @Override public void onItemClick(AdapterView parent, View view, int position, long id) { if(saveView==view){ saveView.setBackgroundResource(R.color.nocolor); currentPlayMusicNum=0; } else{ if(saveView!=null) saveView.setBackgroundResource(R.color.nocolor); view.setBackgroundResource(R.color.colorblue); saveView=view; currentPlayMusicNum=position; musicStart(currentPlayMusicNum); } //id_this=position; } }); sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } @Override public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // TODO Auto-generated method stub if(fromUser){ sb.setProgress(progress); //musicPause(); MusicModel music=musicList.get(currentPlayMusicNum); music.setPlayTime(music.getAllTime()*progress/100); //pausePosition=(int) (music.getAllTime()*progress/100); player.seekTo((int) music.getPlayTime()); player.start(); } } }); }
下面是一个简单进度条音乐播放器代码,使用了Android系统自的MediaPlayer类来实现音乐播放功能,并结合SeekBar控件来实现进度条。 ``` public class MainActivity extends AppCompatActivity { private MediaPlayer mediaPlayer; private SeekBar seekBar; private Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mediaPlayer = MediaPlayer.create(this, R.raw.music); // 初始化MediaPlayer并加载音乐文件 seekBar = findViewById(R.id.seek_bar); // 获取SeekBar控件 // 设置SeekBar的最大值为音乐文件的长度 seekBar.setMax(mediaPlayer.getDuration()); // 设置SeekBar的拖动事件监听器 seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (fromUser) { mediaPlayer.seekTo(progress); // 将播放位置跳转到SeekBar拖动位置 } } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); // 每隔1秒更新SeekBar的进度 handler.post(new Runnable() { @Override public void run() { if (mediaPlayer != null) { int currentPosition = mediaPlayer.getCurrentPosition(); seekBar.setProgress(currentPosition); } handler.postDelayed(this, 1000); } }); } // 播放按钮的点击事件处理方法 public void play(View view) { mediaPlayer.start(); // 开始播放音乐 } // 暂停按钮的点击事件处理方法 public void pause(View view) { mediaPlayer.pause(); // 暂停播放音乐 } @Override protected void onDestroy() { super.onDestroy(); if (mediaPlayer != null) { mediaPlayer.release(); // 释放MediaPlayer占用的资源 mediaPlayer = null; } } } ``` 需要在布局文件中添加一个SeekBar和两个Button(播放和暂停按钮): ``` <SeekBar android:id="@+id/seek_bar" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="16dp" android:paddingRight="16dp" android:progress="0" /> <Button android:id="@+id/play_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="播放" android:onClick="play" /> <Button android:id="@+id/pause_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="暂停" android:onClick="pause" /> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值