2010-07-20 92 views
3

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

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

回答

3

你是对的,不需要很多OnCompletionListener's。

//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 
    } 
}); 
+0

好的答案.... – vnshetty 2011-08-16 04:07:09

0

创建资源目录的原始文件夹,并把在那里,你的声音文件

现在...使用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; 
    } 
} 
+0

我尝试过,但后4-5秒的音频突然停止......你知道这是为什么发生? – 2015-10-12 09:52:35

相关问题