我通读了一个教程并创建了一个名为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卡根目录中的歌曲。
答案 0 :(得分: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());
}
}