【问题标题】:Auto playing songs in a list?自动播放列表中的歌曲?
【发布时间】:2014-10-18 04:38:59
【问题描述】:

我通读了教程并创建了一个名为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());
        }
    }
}

另外,我怎样才能让它在应用程序运行时列出 sdcard、手机存储和 sdcard 上的文件夹中的所有歌曲?目前它只列出了 sdcard 根目录下的歌曲。

【问题讨论】:

    标签: android audio android-mediaplayer


    【解决方案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());
        }
    }
    

    【讨论】:

    • 我已经进行了更改,现在它只是不断地播放同一首歌曲。另外,有没有办法创建第二个目录,应用程序可以在其中找到两个目录中的歌曲并将它们都放入一个列表中?
    • 我在onCompletion 方法中更改了一行并添加了另一行,mp.setDataSource(SD_PATH + songs.get(SONG_NUMBER + 1)); SONG_NUMBER = SONG_NUMBER +1; 现在可以完美运行。你知道怎么做,以便应用程序可以找到 SD 卡和手机存储中的所有歌曲并将它们一起添加到一个列表中吗?
    • 播放到最后一首歌曲并播放完然后应用程序强制意外关闭,我该如何让它在列表末尾返回开始并再次播放?
    • 每次检查列表中的歌曲数量..... if(SONG_NUMBER==list.length()-1) then SONG_NUMBER=0;否则 SONG_NUMBER++;这样做
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 2017-09-09
    相关资源
    最近更新 更多