【问题标题】:Shuffle songs in music player在音乐播放器中随机播放歌曲
【发布时间】:2016-07-18 13:39:48
【问题描述】:

我刚刚开始 Android 开发和 Java,这是我第一个熟悉 Android 开发的应用程序。我几乎完成了这个应用程序,唯一剩下的就是随机播放歌曲。我尝试了许多步骤来正确解决问题,并且我已经在网络和 SO 上搜索了相关问题,但我仍然无法正确解决。

这段代码在我的 Service 类中,播放列表是从 Main Activity 传递的:

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

下面的代码是歌曲的播放方式,这个 sn-p 在 configPlayBack() 方法中,从歌曲 id 播放歌曲:

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

播放下一首歌曲的 sn-p 是:

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

        }

【问题讨论】:

  • 发布你的整个播放方法
  • 我已经对其进行了编辑以包含播放方法@Murat K.

标签: android random shuffle indices android-music-player


【解决方案1】:

好的,您正在使用

改组新创建的列表

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

但您仍在使用旧播放列表

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

我不知道你为什么要使用那条线。只需将其更改为

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

【讨论】:

  • 该列表是整数的 ArrayList (ArrayList list;) 不是 SongModel 对象的 ArrayList。之前,我也尝试过创建 songModel 的 ArrayList( ArrayList list;),然后使用您的建议: item = list.get(position).getSongId();它使洗牌工作正常,但我的 RecyclerView 项目位置发生了变化。当您单击特定歌曲时,由于随机列表,它会播放另一首歌曲。 @Murak K.
  • item = playList.get(MusicPref.isShuffle(this)?list.get(position): position).getSongId();此行检查是否启用了随机播放,如果为真,则从随机播放列表中获取要播放的歌曲索引。如果为 false,则使用正常位置。至少我认为它应该是这样工作的。但由于某种原因,它不起作用。
  • @JohnSmith 好吧,您要求的是随机列表。如果您的RecyclerView 不适合它,那就是另一个问题,您应该为此创建一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 2012-04-16
  • 1970-01-01
相关资源
最近更新 更多