【问题标题】:How can i have a mediaPlayer in android to play 2 or more mp3 files one after one?如何在 android 中使用 mediaPlayer 一个接一个地播放 2 个或多个 mp3 文件?
【发布时间】:2020-09-29 22:23:28
【问题描述】:

我正在创建一个 android 应用程序,我希望它一个接一个地播放多个 mp3 文件。

我的应用中有 mediaPlayer,如何设置播放 mp3 文件的队列?

【问题讨论】:

    标签: android android-mediaplayer


    【解决方案1】:

    实现这一点的方法是创建一个实现 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]); 中获得延迟怎么办?
    【解决方案2】:

    您可以设置一个 LinkedList 和一个互补的 ListIterator 来管理 MediaPlayers 队列。

    对于您知道应该在队列中的每个 mp3 文件,使用使用MediaPlayer.create(); 创建的媒体播放器调用 ListIterator 的 add() 方法

    请注意,在管理队列时,您需要非常小心迭代器的位置。

    【讨论】:

      猜你喜欢
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多