2016-07-18 11 views
0

Ich starte gerade Android-Entwicklung und Java, und dies ist meine erste App, um Android-Entwicklung kennen zu lernen. Ich bin fast fertig mit der App, das einzige, was übrig bleibt, sind schlurfende Songs. Ich habe viele Schritte ausprobiert, um es richtig zu machen, und ich habe das Web und SO nach verwandten Fragen durchforstet, aber ich kann es immer noch nicht richtig machen.Shuffle Songs in Musik-Player

Dieser Code-Schnipsel in meiner Dienstklasse, Playlist von Hauptaktivität geführt wird:

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())); 
} 

Der folgende Code wird wie Songs gespielt werden, ist dieser Ausschnitt in configPlayBack() -Methode, die das Lied spielt aus der Song-ID:

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

das snippet für den nächsten Song zu spielen ist:

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

Aber die Songs spielen immer noch seriell.

EDIT:

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

posten Sie Ihre gesamte Wiedergabemethode –

+0

ich es bearbeitet haben die Wiedergabemethode @Murat K. –

Antwort

0

Ok Sie Ihre neu erstellte Liste sind schlurfend mit

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

, aber sie sind immer noch die alte Playlist

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

Und ich bin nicht sicher, warum Sie diese Linie überhaupt verwenden. Ändern Sie es einfach zu

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

Die Liste aufzunehmen, ist eine Arraylist von Integer (Arraylist Liste;) nicht eine Arraylist von der SongModel-Objekt. Ich habe auch vorher versucht, eine ArrayList des songModel (ArrayList list;) zu erstellen und dann zu verwenden, was du vorgeschlagen hast: item = list.get (position) .getSongId(); Das Mischen funktioniert einwandfrei, aber meine RecyclerView-Position ändert sich. Wenn Sie auf einen bestimmten Song klicken, wird aufgrund der gemischten Liste ein anderer Song wiedergegeben. @Murak K. –

+0

item = playList.get (MusicPref.isShuffle (diese)? List.get (position): position) .getSongId(); Diese Zeile prüft, ob das Shuffling aktiviert ist. Wenn es wahr ist, wird der Song-Index aus der gemischten Liste wiedergegeben. Wenn es falsch ist, verwendet es die normale Position. Zumindest denke ich, dass es funktionieren sollte. Aber aus irgendeinem Grund funktioniert es nicht. –

+0

@JohnSmith Nun, Sie haben nach einer gemischten Liste gefragt. Wenn Ihr 'RecyclerView' nicht hineinpasst, ist das ein anderes Problem und Sie sollten eine Frage dafür erstellen. –