2014-10-18 102 views
0

我通过教程阅读并创建了一个名为SimplePlayer的简单音乐播放器。当我点击我想播放的歌曲时,播放效果非常好。自动播放列表中的歌曲?

但是,当该歌曲结束时,不是播放下一首歌曲,而是播放列表中的第二首歌曲,然后一直播放它。

我知道这首歌的时候第一首歌曲结束的选择是onCompletion方法与mp.setDataSource里面,但我不知道我需要把比+1其他支架,使其播放下歌曲列表:

public void onCompletion(MediaPlayer mp) { 
     try { 
      mp.reset(); 
      mp.setDataSource(SD_PATH + songs.get(+1)); 
      mp.prepare(); 
      mp.start(); 
      play.setEnabled(false); 
      pause.setEnabled(true); 
      stop.setEnabled(true); 
     } catch(IOException e) { 
      Log.v(getString(R.string.app_name), e.getMessage()); 
     } 

下面是代码的情况下,其余的我都没有改变的东西还有:

public class MainActivity extends ListActivity implements OnCompletionListener { 
private static final String SD_PATH = new String(Environment.getExternalStorageDirectory().getPath() + "/"); 
private List<String> songs = new ArrayList<String>(); 
private MediaPlayer mp = new MediaPlayer(); 
private View play; 
private View pause; 
private View stop; 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    updatePlaylist(); 
    play = (ImageButton)findViewById(R.id.imageButton1); 
    pause = (ImageButton)findViewById(R.id.imageButton2); 
    stop = (ImageButton)findViewById(R.id.imageButton3); 
    mp.setOnCompletionListener(this); 
    play.setEnabled(false); 
    pause.setEnabled(false); 
    stop.setEnabled(false); 
} 

@Override 
protected void onListItemClick(ListView list, View view, int position, long id) { 
    try { 
     mp.reset(); 
     mp.setDataSource(SD_PATH + songs.get(position)); 
     mp.prepare(); 
     mp.start(); 
     play.setEnabled(false); 
     pause.setEnabled(true); 
     stop.setEnabled(true); 
    } catch(IOException e) { 
     Log.v(getString(R.string.app_name), e.getMessage()); 
    } 
} 
private void updatePlaylist() { 
    File home = new File(SD_PATH); 
    if (home.listFiles(new Mp3Filter()).length > 0) { 
     for (File file : home.listFiles(new Mp3Filter())) { 
      songs.add(file.getName()); 
     } 
    ArrayAdapter<String> songList = new ArrayAdapter<String>(this,R.layout.song_item,songs); 
    setListAdapter(songList); 
} 
} 

    public void play(View view){ 
     Toast.makeText(getApplicationContext(), "Playing song", 
     Toast.LENGTH_SHORT).show(); 
     mp.start(); 
     play.setEnabled(false); 
     pause.setEnabled(true); 
     stop.setEnabled(true); 
     } 



    public void pause(View view){ 
     Toast.makeText(getApplicationContext(), "Pausing song", 
     Toast.LENGTH_SHORT).show(); 
     mp.pause(); 
     play.setEnabled(true); 
     pause.setEnabled(false); 
     stop.setEnabled(true); 
    }  


    public void stop(View view){ 
     Toast.makeText(getApplicationContext(), "Stopping song", 
     Toast.LENGTH_SHORT).show(); 
      mp.stop(); 
      play.setEnabled(false); 
      pause.setEnabled(false); 
      stop.setEnabled(false); 
    } 


@Override 
     public void onCompletion(MediaPlayer mp) { 
     try { 
      mp.reset(); 
      mp.setDataSource(SD_PATH + songs.get(+1)); 
      mp.prepare(); 
      mp.start(); 
      play.setEnabled(false); 
      pause.setEnabled(true); 
      stop.setEnabled(true); 
     } catch(IOException e) { 
      Log.v(getString(R.string.app_name), e.getMessage()); 
     } 
    } 
} 

也,我怎样才能让这个当应用程序运行,它列出了sd上的所有歌曲卡,手机存储和SD卡上的文件夹?目前它只列出了SD卡根目录中的歌曲。

回答

1

你写的是连续播放第二首歌。 你需要使用一个全局变量来表示歌曲数量和增加它并传递到setDataSource();

首先,创建一个公共全局变量

public static int SONG_NUMBER=0; 

在你onCompletion方法

@Override 
     public void onCompletion(MediaPlayer mp) { 
     try { 
      mp.reset(); 
      if(SONG_NUMBER == songs.size()) 
      { 
      SONG_NUMBER=0; 
      } 
      else 
      { 
      SONG_NUMBER=SONG_NUMBER+1; 
      } 
      mp.setDataSource(SD_PATH + songs.get(SONG_NUMBER));// pass SONG_NUMBER++ instead +1 
      mp.prepare(); 
      mp.start(); 
      play.setEnabled(false); 
      pause.setEnabled(true); 
      stop.setEnabled(true); 
     } catch(IOException e) { 
      Log.v(getString(R.string.app_name), e.getMessage()); 
     } 
    } 

在你的ListItemClick方法,根据位置分配SONG_NUMBER

@Override 
protected void onListItemClick(ListView list, View view, int position, long id) { 
    try { 
     SONG_NUMBER=position; // <------------------------add this line 
     mp.reset(); 
     mp.setDataSource(SD_PATH + songs.get(position)); 
     mp.prepare(); 
     mp.start(); 
     play.setEnabled(false); 
     pause.setEnabled(true); 
     stop.setEnabled(true); 
    } catch(IOException e) { 
     Log.v(getString(R.string.app_name), e.getMessage()); 
    } 
} 
+0

我已经做了更改,现在它不断播放同一首歌曲。另外,有没有什么办法可以创建第二个目录,在这个目录中应用程序从两个目录中找到歌曲,并将它们放到一个列表中? – soul6942 2014-10-18 06:09:56

+0

我改变了一行,并在'onCompletion'方法中添加了另一个'mp.setDataSource(SD_PATH + songs.get(SONG_NUMBER + 1));''SONG_NUMBER = SONG_NUMBER +1;'现在它完美地工作。你知道如何制作它,以便应用程序可以找到SD卡和手机存储中的所有歌曲,并将它们一起添加到一个列表中? – soul6942 2014-10-18 06:25:26

+0

[点击这里做... ..从不同的目录中获取歌曲,并将它们放入单个列表中](0123)http://android-building-audio-player-tutorial/ – 2014-10-18 07:02:41

相关问题