英文:
MediaPlayer problem: all songs playing at the same time
问题
所以我正在尝试播放用户选择的某些歌曲混合。我正在创建一个字符串数组,其中包含应该在MediaPlayer中播放的文件名。问题是所有的歌曲都同时播放。我已经尝试了各种方法,但仍然不知道如何确保播放器在开始另一首歌之前等待一首歌结束。
我尝试过以下方法:
public void play(View v){
if(player==null)
{
while(true) {
if(i==brojac) break; //检查数组列表是否已结束
if(player.isPlaying()==false) {
i++;
String s = lista.get(i).toString();
player = MediaPlayer.create(this, (this.getResources().getIdentifier(s, "raw", this.getPackageName())));
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
stopPlayer();
}
});
player.start();
}
}
}
}
private void stopPlayer()
{
if(player!=null)
{
player.release();
player=null;
}
}
编辑
根据下面的答案,一切正常,但是播放器有明显的间隔。我使用了setNextPlayer()函数解决了这个问题,但由于在播放时重新创建播放器,应用程序崩溃了。
void playSong(int currentSong) {
player = MediaPlayer.create(this, currentSong);
player1 = MediaPlayer.create(this,this.getResources().getIdentifier(lista.get(i+1).toString(),"raw",getPackageName()));
player.setNextMediaPlayer(player1);
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
player.release();
i++;
if(i==brojac) return;
player1.start();
playSong(MainActivity.this.getResources().getIdentifier(lista.get(i).toString(),"raw",getPackageName()));
}
});
if(i==0) {
player.start();
}
}
英文:
So I'm trying to play a certain mix of songs that user chooses. I'm making an array of strings that are filenames that should be played in MediaPlayer. The problem is that all of the songs play at the same time. I've tried everything but still don't know how to make sure player waits for a song to end before it starts another one.
Here's what I've tried:
public void play(View v){
if(player==null)
{
while(true) {
if(i==brojac) break; //checking if the arraylist has ended
if(player.isPlaying()==false) {
i++;
String s = lista.get(i).toString();
player = MediaPlayer.create(this, (this.getResources().getIdentifier(s, "raw", this.getPackageName())));
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
stopPlayer();
}
});
player.start();
}
}
}
}
private void stopPlayer()
{
if(player!=null)
{
player.release();
player=null;
}
}
EDIT
With the answer below everything works,but the player is having noticable gap. I've solved it with setNextPlayer() function, but the app crashes due to recreating the player while it is playing.
void playSong(int currentSong) {
player = MediaPlayer.create(this, currentSong);
player1 = MediaPlayer.create(this,this.getResources().getIdentifier(lista.get(i+1).toString(),"raw",getPackageName()));
player.setNextMediaPlayer(player1);
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
player.release();
i++;
if(i==brojac) return;
player1.start();
playSong(MainActivity.this.getResources().getIdentifier(lista.get(i).toString(),"raw",getPackageName()));
}
});
if(i==0) {
player.start();
}
}
答案1
得分: 0
我相信您想要这个:
ArrayList<Integer> songs = new ArrayList<>();
private MediaPlayer mediaPlayer;
private int currentIndex = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Field[] fields = R.raw.class.getFields();
for (Field field : fields)
songs.add(getResources().getIdentifier(field.getName(), "raw", getPackageName()));
playSong(songs.get(currentIndex));
}
void playSong(int currentSong) {
mediaPlayer = MediaPlayer.create(this, currentSong);
mediaPlayer.setOnCompletionListener(completeListener);
mediaPlayer.start();
}
MediaPlayer.OnCompletionListener completeListener = mp -> {
mp.release();
currentIndex++;
playSong(songs.get(currentIndex));
};
解释:
以下代码将从“raw”文件夹获取所有音频文件,并将它们存储在名为“songs”的ArrayList
中:
Field[] fields = R.raw.class.getFields();
for (Field field : fields)
songs.add(getResources().getIdentifier(field.getName(), "raw", getPackageName()));
要播放歌曲:
void playSong(int currentSong) {
mediaPlayer = MediaPlayer.create(this, currentSong);
mediaPlayer.setOnCompletionListener(completeListener);
mediaPlayer.start();
}
当歌曲播放完毕时,OnCompletionListener
侦听器会释放当前的MediaPlayer
,然后将currentIndex
递增,以便songs.get(currentIndex)
将提供下一首歌曲:
MediaPlayer.OnCompletionListener completeListener = mp -> {
mp.release();
currentIndex++;
playSong(songs.get(currentIndex));
};
英文:
I believe you want this :
ArrayList<Integer> songs = new ArrayList<>();
private MediaPlayer mediaPlayer;
private int currentIndex = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Field[] fields = R.raw.class.getFields();
for (Field field : fields)
songs.add(getResources().getIdentifier(field.getName(), "raw", getPackageName()));
playSong(songs.get(currentIndex));
}
void playSong(int currentSong) {
mediaPlayer = MediaPlayer.create(this, currentSong);
mediaPlayer.setOnCompletionListener(completeListener);
mediaPlayer.start();
}
MediaPlayer.OnCompletionListener completeListener = mp -> {
mp.release();
currentIndex++;
playSong(songs.get(currentIndex));
};
Explication :
The below code, will get all the audio files from raw
folder and store them in the ArrayList
called songs :
Field[] fields = R.raw.class.getFields();
for (Field field : fields)
songs.add(getResources().getIdentifier(field.getName(), "raw", getPackageName()));
To play song :
void playSong(int currentSong) {
mediaPlayer = MediaPlayer.create(this, currentSong);
mediaPlayer.setOnCompletionListener(completeListener);
mediaPlayer.start();
}
the OnCompletionListener
listener, when the song ends, you need to increment the currentIndex
so the songs.get(currentIndex)
will give you the next song
MediaPlayer.OnCompletionListener completeListener = mp -> {
mp.release();
currentIndex++;
playSong(songs.get(currentIndex));
};
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论