如何一个接一个地播放音频文件

时间:2010-07-20 09:15:30

标签: android audio

我的应用程序的assets目录中有多个音频文件。当用户单击按钮时,我想按照特定顺序播放这些文件,一个接一个。音频文件之间不应有明显的延迟。实现这一目标的最佳方法是什么?

我正在考虑使用MediaPlayer个对象和OnCompletionListener。但是,这意味着我必须创建很多OnCompletionListener因为我需要知道每次下一个音频文件。我错过了什么或者有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

你是正确的,不需要很多OnCompletionListener。

//define a variable to be used as index.
int audioindex = 0;
//Extract the files into an array
String[] files = null;
files = assetManager.list("audiofiles");

然后在你的OnCompletionListener。

 mp.setOnCompletionListener(new OnCompletionListener(){
    // @Override
    public void onCompletion(MediaPlayer arg0) {
    // File has ended, play the next one.
   FunctionPlayFile(files[audioindex]);
   audioindex+=1; //increment the index to get the next audiofile
     }
});

答案 1 :(得分:1)

检查一下,这些类可以一个接一个地播放mp3网址,我在某个时候粗略地创建它们,并且可以调整以便从资产中播放........

https://github.com/vivdub/AndroidMediaplayer

答案 2 :(得分:0)

在res目录中创建raw文件夹并将声音文件放在那里

现在......使用PlayMedia像这样

int[] soundIDs = {R.raw.yes, R.raw.eat};
PlayMedia playAudio = new PlayMedia(context,soundIDs);
playAudio.execute();

并定义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;
    }
}