自动播放列表中的歌曲?

时间:2014-10-18 04:39:00

标签: android audio android-mediaplayer

我通读了一个教程并创建了一个名为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 个答案:

答案 0 :(得分: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());
        }
    }

在您的on 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());
    }
}