.我在昨天的基础上学习了多音乐的播放,切换音乐,进度条显示。设置按钮上一首和下一首的操作,发现用到了线程方面的知识,我又重新学习了线程。并打算通过SD可以直接使用手机内存中的音乐,但是一直显示SD音乐导入不进去。明天继续bug的修改。
主要代码:
package com.example.keeprunning; import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Environment; import android.util.Log; import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; import java.util.List; public class MusicService { //获取SD卡总目录 //private static final File PATH = Environment.getExternalStorageDirectory(); String PATH=Environment.getExternalStorageDirectory().getAbsolutePath(); //存放找到的所有mp3的绝对路径 public List<String> musicList; //定义多媒体对象 public MediaPlayer player; //当前播放的歌曲在List中的下标,flag为标致 public int songNum; //当前播放的歌曲名 public String songName; //写一个内部类供加载mp3文件的时候调用 class MusicFilter implements FilenameFilter { public boolean accept(File dir, String name) { //返回当前目录所有以.mp3结尾的文件 return (name.endsWith(".mp3")); } } //在MusicService类的无参构造函数中实例化对象,并把这些MP3文件放到musicList中 public MusicService() { super(); //实例化一个多媒体对象 player = new MediaPlayer(); //实例化一个List链表数组 musicList = new ArrayList<String>(); try { //获取根目录的二级目录Music File MUSIC_PATH = new File(PATH, "Music"); if (MUSIC_PATH.listFiles(new MusicFilter()).length > 0) { for (File file : MUSIC_PATH.listFiles(new MusicFilter())) { musicList.add(file.getAbsolutePath()); } } } catch (Exception e) { Log.i("TAG", "读取文件异常"); } } //用setPlayName方法来修改获取到的mp3文件的名字供我们在TextView页面中使用 public void setPlayName(String dataSource){ File file=new File(dataSource); String name=file.getName(); int index=name.lastIndexOf("."); songName=name.substring(0,index); } //定义play类实现单首音乐的播放 public void play(){ try{ //重制多媒体 player.reset(); //得到当前播放音乐的路径 String dataSource =musicList.get(songNum); //载取歌名 setPlayName(dataSource); //指定参数为音频文件 player.setAudioStreamType(AudioManager.STREAM_MUSIC); //为多媒体对象设置播放路径 player.setDataSource(dataSource); //准备播放 player.prepare(); //开始播放 player.start(); //setOnCompletionListener当前多媒体对象播放完成时发生的事件 player.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){ public void onCompletion(MediaPlayer arg0){ //如果当前歌曲播放完毕,自动播放下一首 next(); } }); }catch(Exception e){ Log.v("MusicService", e.getMessage()); } } //继续播放 public void goPlay(){ int position=getCurrentProgress(); //设置当前MediaPlayer的播放位置,单位是毫秒 player.seekTo(position); try{ //同步方式装载流媒体文件 player.prepare(); }catch(Exception e){ e.printStackTrace(); } player.start(); } // 获取当前进度 public int getCurrentProgress() { if (player != null & player.isPlaying()) { return player.getCurrentPosition(); } else if (player != null & (!player.isPlaying())) { return player.getCurrentPosition(); } return 0; } public void next() { songNum = songNum == musicList.size() - 1 ? 0 : songNum + 1; play(); } public void last() { songNum = songNum == 0 ? musicList.size() - 1 : songNum - 1; play(); } // 暂停播放 public void pause() { if (player != null && player.isPlaying()){ player.pause(); } } public void stop() { if (player != null && player.isPlaying()) { player.stop(); player.reset(); } } }
//为各组事件绑定监听事件 try { setListViewAdapter();//添加文件名字 } catch (Exception e) { Log.i("TAG", "读取信息失败"); } btnStart = (Button) findViewById(R.id.btn_star); btnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { try { /** * 引入flag作为标志,当flag为1 的时候,此时player内没有东西,所以执行musicService.play()函数 * 进行第一次播放,然后flag自增二不再进行第一次播放 * 当再次点击“开始/暂停”按钮次数即大于1 将执行暂停或继续播放goplay()函数 */ if (flag == 1) { musicService.play(); flag++; } else { if (!musicService.player.isPlaying()) { musicService.goPlay(); } else if (musicService.player.isPlaying()) { musicService.pause(); } } } catch (Exception e) { Log.i("LAT", "开始异常!"); } } }); btnStop = (Button) findViewById(R.id.btn_stop); btnStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { try { musicService.stop(); flag = 1;//当点击停止按钮时,flag置为1 seekBar.setProgress(0); txtInfo.setText("播放已经停止"); } catch (Exception e) { Log.i("LAT", "停止异常!"); } } }); btnLast = (Button) findViewById(R.id.btn_last); btnLast.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { try { musicService.last(); } catch (Exception e) { Log.i("LAT", "上一曲异常!"); } } }); btnNext = (Button) findViewById(R.id.btn_next); btnNext.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { try { musicService.next(); } catch (Exception e) { Log.i("LAT", "下一曲异常!"); } } }); seekBar = (SeekBar) findViewById(R.id.sb); seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) {//用于监听SeekBar进度值的改变 } @Override public void onStartTrackingTouch(SeekBar seekBar) {//用于监听SeekBar开始拖动 } @Override public void onStopTrackingTouch(SeekBar seekBar) {//用于监听SeekBar停止拖动 SeekBar停止拖动后的事件 int progress = seekBar.getProgress(); Log.i("TAG:", "" + progress + ""); int musicMax = musicService.player.getDuration(); //得到该首歌曲最长秒数 int seekBarMax = seekBar.getMax(); musicService.player .seekTo(musicMax * progress / seekBarMax);//跳到该曲该秒 autoChange = true; manulChange = false; } }); }