2016-07-18 297 views
0

我剛剛開始Android開發和Java,這是我第一個熟悉Android開發的應用程序。我幾乎完成了應用程序,唯一剩下的就是洗牌歌曲。我嘗試了很多步驟來解決問題,並且我搜索了網頁,搜索了相關的問題,但仍然無法解決問題。在音樂播放器中隨機播放歌曲

的這段代碼是在我的服務類,播放列表從主要活動通過:

public void setPlayList(ArrayList<SongModel> playlist) { 
     playList = playlist; 
     //Arraylist of integer to hold the number of indices 
     list = new ArrayList<Integer>(); 
     for(int i =0; i <= playList.size();i++){ 
     list.add(i); 
    } 

Collections.shuffle(list, new Random(System.nanoTime())); 
} 

下面的代碼是歌曲怎麼打,這個片段是在configPlayBack()方法,從播放歌曲歌曲ID:

long item = 0; 
item = playList.get(MusicPref.isShuffle(this)? list.get(position): position).getSongId(); 

播放下一首歌曲的片段是:

public void playNext() { 
      position++; 
      if (position >= playList.size()) { 
       position = 0; 
      } 
     configPlayBack(); 
    } 

但歌曲仍在連續播放。

編輯:

public void configPlayBack(){ 
      prepared = true; 
      player.reset(); 
      if (playList.size()>0){ 
       long item = 0; 
       item = playList.get(MusicPref.isShuffle(this)? list.get(position):position).getSongId(); 
       playItem(item); 
      } 
     } 
     public void playItem(long item){ 
      Uri base = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
      Uri trackUri = ContentUris.withAppendedId(base, item); 
      try{ 
       player.setDataSource(getApplicationContext(), trackUri); 
      } 
      catch(Exception e){ 
       Log.e(TAG, "Errror setting data source", e); 
      } 
      try{ 
       player.prepare(); 
      } 
      catch(Exception ee) 
      { 
       ee.printStackTrace(); 
       Log.e(TAG, "Error setting data source", ee); 
       Toast.makeText(getApplicationContext(), "Song corrupt or not supported", Toast.LENGTH_SHORT).show(); 
       ee.printStackTrace(); 
       isReady = false; 
      } 
      player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
       @Override 
       public void onPrepared(MediaPlayer mp) { 
        isReady = true; 
          setPlayState(); 
          getAudioFocus(); 
          mp.start(); 
         updateNotificationPlayer(); 
          updatePlayback(); 
          updateSeek(); 
        player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
         @Override 
         public void onCompletion(MediaPlayer mp) { 
          isReady = false; 
          mp.reset(); 
          playNext(); 
         } 
        }); 
       } 
      }); 

     } 
+0

發表您的整個回放方法 –

+0

我已經編輯到包括@Murat K. –

回答

0

好你與

Collections.shuffle(list, new Random(System.nanoTime()));

洗牌新創建的列表,但您仍然使用舊的播放列表

item = playList.get(MusicPref.isShuffle(this)? list.get(position): position).getSongId(); 

而且我不確定你爲什麼使用那條線。簡單地將其更改爲

item = list.get(position).getSongId(); 
+0

列表播放方法,是整數的ArrayList(ArrayList的列表;)不是的一個ArrayList SongModel對象。我也嘗試過,先創建一個songModel的ArrayList(ArrayList list;)然後使用你的建議:item = list.get(position).getSongId();它使洗牌工作正常,但我的RecyclerView項目位置發生變化。當你點擊一首特定的歌曲時,由於洗牌清單,它會播放另一首歌曲。 @Murak K. –

+0

item = playList.get(MusicPref.isShuffle(this)?list.get(position):position).getSongId();此行檢查是否啓用了混洗,如果爲true,則會從混洗列表中獲取要播放的歌曲索引。如果爲false,則使用正常位置。至少我認爲這應該起作用。但由於某種原因,它不起作用。 –

+0

@JohnSmith嗯,你問了洗牌清單。如果你的'RecyclerView'不適合它,這是另一個問題,你應該爲此提出一個問題。 –