【发布时间】:2020-09-29 22:23:28
【问题描述】:
我正在创建一个 android 应用程序,我希望它一个接一个地播放多个 mp3 文件。
我的应用中有 mediaPlayer,如何设置播放 mp3 文件的队列?
【问题讨论】:
标签: android android-mediaplayer
我正在创建一个 android 应用程序,我希望它一个接一个地播放多个 mp3 文件。
我的应用中有 mediaPlayer,如何设置播放 mp3 文件的队列?
【问题讨论】:
标签: android android-mediaplayer
实现这一点的方法是创建一个实现 OnCompletionListener 的类,该类处理 onCompletion 并接收下一个要播放的文件。 首先像这样将您的类定义为 PlayMedia:
import android.content.Context;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.AsyncTask;
import android.util.Log;
public class PlayMedia extends AsyncTask<Void, Void, Void> {
private static final String LOG_TAG = PlayMedia.class.getSimpleName();
Context context;
private MediaPlayer mediaPlayer;
int[] soundIDs;
int idx =1;
public PlayMedia(MediaPlayer mediaPlayer) {
this.mediaPlayer = mediaPlayer;
}
public PlayMedia(final Context context, final int[] soundIDs) {
this.context = context;
this.soundIDs=soundIDs;
mediaPlayer = MediaPlayer.create(context,soundIDs[0]);
setNextMediaForMediaPlayer(mediaPlayer);
}
public void setNextMediaForMediaPlayer(MediaPlayer player){
player.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
if(soundIDs.length>idx){
mp.release();
mp = MediaPlayer.create(context,soundIDs[idx]);
setNextMediaForMediaPlayer(mp);
mp.start();
idx+=1;
}
}
});
}
@Override
protected Void doInBackground(Void... params) {
try {
mediaPlayer.start();
} catch (IllegalArgumentException e) {
Log.e(LOG_TAG, "", e);
} catch (SecurityException e) {
Log.e(LOG_TAG, "", e);
} catch (IllegalStateException e) {
Log.e(LOG_TAG, "", e);
}
return null;
}
}
然后像这样使用 PlayMedia:
int[] soundIDs = {R.raw.firstmp3, R.raw.secondmp3};
PlayMedia playAudio = new PlayMedia(context,soundIDs);
playAudio.execute();
【讨论】:
MediaPlayer.create(context,soundIDs[idx]); 中获得延迟怎么办?
您可以设置一个 LinkedList 和一个互补的 ListIterator 来管理 MediaPlayers 队列。
对于您知道应该在队列中的每个 mp3 文件,使用使用MediaPlayer.create(); 创建的媒体播放器调用 ListIterator 的 add() 方法
请注意,在管理队列时,您需要非常小心迭代器的位置。
【讨论】: