2014-10-18 149 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

相關問題