我是把mp3格式文件放在raw文件夹内,播放代码为:
mp = MediaPlayer.create(MainActivity.this,R.raw.music);
mp.start();
如何做到上一首下一首切换,希望能有一个例子(比如raw内有两个文件:music.mp3与music1.mpc)。
例子能看得更加具体,明白。
首先你 要有个list存放它的物理路径,切歌也只是更改他的下标获取不同歌曲的物理路径
能不能给我几句,让我看看例子。。。我知道是用list,不知道怎么实现。。
public class MainService extends Service {
//列表循环
public static final int MENU_RECICLE=1;
//单曲循环
public static final int SINGLE_RECICLE=2;
//随机播放
public static final int RADOM=3;
//播放下一首
public static final int OPER_NEXT=1;
//播放上一首
public static final int OPER_PREVIOUS=-1;
/*当前歌曲播放状态——播放列表刚刚加载或没有加载,并未播放任何歌曲*/
private static final int UNPLAY=-1;
/*当前歌曲播放状态——当前歌曲被暂停*/
private static final int PAUSE=1;
/*当前歌曲播放状态——当前歌曲被停止*/
private static final int STOP=2;
/*当前歌曲播放状态——正在播放*/
private static final int PLAYING=3;
/*当前歌曲播放状态——播放完成*/
private static final int PLAYCOM=4;
//保存当前播放状态
private int currMode=MENU_RECICLE;
//用于显示播放列表的数据源
private List<Map<String,Object>> musicList=new ArrayList<Map<String,Object>>();
private MediaPlayer mPlayer;
//当前播放的歌曲索引
private int currIndex=-1;
//当前歌曲的播放状态
private int currStatus=UNPLAY;
public MainService() {
super();
// TODO Auto-generated constructor stub
mPlayer=new MediaPlayer();
mPlayer.setOnCompletionListener(new OnCompletionListener(){
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
currStatus=PLAYCOM;
}
});
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return new MainBinder();
}
public boolean isComplete(){
return currStatus==PLAYCOM;
}
/**
* 获得当前切换策略的内容
* @return
*/
public String getMode(){
switch(currMode){
case MENU_RECICLE:
return "列表循环";
case SINGLE_RECICLE:
return "单曲循环";
case RADOM:
return "随机播放";
default:
return "";
}
}
/**
* 改变切换策略
* @return
*/
public String changeMode(){
switch(currMode){
case MENU_RECICLE:
currMode=SINGLE_RECICLE;
return "单曲循环";
case SINGLE_RECICLE:
currMode=RADOM;
return "随机播放";
case RADOM:
currMode=MENU_RECICLE;
return "列表循环";
default:
return "";
}
}
/**
* 找当前目录下的音乐文件
* @param musicUrl 要找寻音乐文件的目录路径
* @return
*/
public List<Map<String,Object>> refeshMusicList(String musicUrl){
File musicDir=new File(musicUrl);
if(musicDir!=null&&musicDir.isDirectory()){
File[] musicFile=musicDir.listFiles(new MusicFilter());
if(musicFile!=null){
musicList=new ArrayList<Map<String,Object>>();
for(int i=0;i<musicFile.length;i++){
File currMusic=musicFile[i];
//获取当前目录的名称和绝对路径
String abPath=currMusic.getAbsolutePath();
String musicName=currMusic.getName();
Map<String,Object> currMusicMap=new HashMap<String,Object>();
currMusicMap.put("musicName", musicName);
currMusicMap.put("musicAbPath", abPath);
musicList.add(currMusicMap);
}
}else{
musicList = new ArrayList<Map<String,Object>>();
}
}else{
musicList = new ArrayList<Map<String,Object>>();
}
return musicList;
}
/**
* 播放歌曲
* @param musicPo 要播放的歌曲在歌曲列表中的索引
* @throws IllegalArgumentException
* @throws SecurityException
* @throws IllegalStateException
* @throws IOException
*/
public void playMusic(int musicPo) throws IllegalArgumentException, SecurityException, IllegalStateException, IOException{
Map<String,Object> currMusic=musicList.get(musicPo);
String musicUrl=(String)currMusic.get("musicAbPath");
mPlayer.reset();
mPlayer.setDataSource(musicUrl);
mPlayer.prepare();
mPlayer.start();
currIndex=musicPo;
currStatus=PLAYING;
}
/**
* 停止播放
*/
public void stopPlay(){
mPlayer.stop();
currStatus=STOP;
}
/**
* 播放一首新的歌曲
* @param operCode 播放操作(是上一首还是下一首)
* @throws IllegalArgumentException
* @throws SecurityException
* @throws IllegalStateException
* @throws IOException
*/
public void playNew(int operCode) throws IllegalArgumentException, SecurityException, IllegalStateException, IOException{
if(musicList.size()>0){
switch(currMode){
case MENU_RECICLE:
int newIndex=0;
switch(operCode){
case OPER_NEXT:
newIndex=currIndex+1;
if(newIndex>=musicList.size()){
newIndex=0;
}
break;
case OPER_PREVIOUS:
newIndex=currIndex-1;
if(newIndex<0){
newIndex=musicList.size()-1;
}
break;
}
playMusic(newIndex);
break;
case SINGLE_RECICLE:
playMusic(currIndex);
break;
case RADOM:
Random rd=new Random();
int randomIndex=rd.nextInt(musicList.size());
playMusic(randomIndex);
break;
}
}
}
/**
* 暂停当前歌曲的播放
*/
public void pause(){
mPlayer.pause();
currStatus=PAUSE;
}
/*
* 释放当前播放的音乐资源
*/
public void release(){
mPlayer.release();
currStatus=UNPLAY;
}
/**
* 播放按钮要执行播放操作时调用
* @throws IOException
* @throws IllegalStateException
* @throws SecurityException
* @throws IllegalArgumentException
*/
public void play() throws IllegalArgumentException, SecurityException, IllegalStateException, IOException{
if(musicList.size()>0){
switch(currStatus){
case UNPLAY:
playMusic(0);
break;
case STOP:
mPlayer.prepare();
mPlayer.seekTo(0);
case PAUSE:
mPlayer.start();
currStatus=PLAYING;
break;
}
}
}
/**
* 改变当前播放进度
* @param progress 新的播放进度
*/
public void changePro(int progress){
if(mPlayer.isPlaying()){
mPlayer.seekTo(progress);
}
}
/**
* 获取当前音乐播放进度
* @return 当前音乐的播放进度
*/
public int getMusicPro(){
if(mPlayer.isPlaying()){
return mPlayer.getCurrentPosition();
}else{
return 0;
}
}
/**
* 获取当前音乐的总时长
* @return
*/
public int getMusicDur(){
return mPlayer.getDuration();
}
private class MusicFilter implements FileFilter{
@Override
public boolean accept(File pathname) {
// TODO Auto-generated method stub
if(pathname.isFile()==true){
String fileName=pathname.getName();
String lowerName=fileName.toLowerCase();
return lowerName.endsWith(".mp3");
}else{
return false;
}
}
}
public class MainBinder extends Binder{
public MainService getService(){
return MainService.this;
}
}
}
知道当前播放的路径在集合中的position,通过对position +1或-1来获取下一首个播放的路径,结束当前的那首歌播放下一首的不就行了
mediaplayuer播放音乐传入就是路径,你把路径改变了歌曲就变了啊 ,上面说的很清楚了感觉,不行你直接用1楼的代码加入自己的逻辑实现了先,再取琢磨认真的