因此,对于我正在开发的应用程序,我有一堆音频文件,根据某些变量的状态,可能会或可能不会播放(并且它们播放的顺序也会发生变化)。
我理解setOnCompletionListener
的基础知识,但我无法找出使用它的最佳方法。目前,如果我想播放audio1,audio2,audio3,我的代码设置如下:
clipSetup(1);
aP.setOnCompleteListener(new MediaPlayer.OnCompletionListener(){
@Override
public void onCompletion(MediaPlayer mp){
clipSetup(2);
aP.setOnCompleteListener(new MediaPlayer.OnCompletionListener(){
@Override
public void onCompletion(MediaPlayer mp){
clipSetup(3);
}
});
}
});
private MediaPlayer clipSetup(int i){
switch (i){
case 1:
aP = MediaPlayer.create(this, R.raw.audio1);
aP.start();
break;
case 2:
aP = MediaPlayer.create(this, R.raw.audio2);
aP.start();
break;
case 3:
aP = MediaPlayer.create(this, R.raw.audio3);
aP.start();
break;
}
return aP;
}
这很有效,但它很丑陋,特别是当我为了某些目的播放15个文件时。有没有更好的方法来完成我上面的工作?
答案 0 :(得分:2)
之前我没有使用音频文件,但这是我最好的镜头
这是一个很好的开始。这只允许您将文件添加到一个接一个播放的缓冲区中。调用addInitFile()来启动音频文件,然后调用addFile()以添加更多文件以在第一个文件之后继续播放。它只是一个开始和代码,没有测试
被抛在一起它可能是更好的代码,但它只是一个开始。至少比案例开关更好
我会将此作为可访问性目的的内部类
public class CustomMediaBuffer{
public static ArrayList<Integer> buffer = new ArrayList<Integer>();
public static void addInitFile(final int res){
buffer.add(res);
ap = MediaPlayer.create(this, res);
ap.start();
ap.setOnCompleteListener(new MediaPlayer.OnCompletionListener(){
public void onCompletion(MediaPlayer mp){
int indx = buffer.indexOf(res);
if(buffer.size()-1>index){
ap = MediaPlayer.create(this, buffer.get(indx+1));
ap.start();
}
}
});
}
public static void addFile(int res){
buffer.add(res);
}
}
以下是更好,更新的代码:
public class CustomMediaBuffer{
public static ArrayList<MediaPlayer> buffer = new ArrayList<MediaPlayer>();
public static void addInitFile(final int res){
buffer.add( MediaPlayer.create(this, res);
ap = buffer.get(0);
ap.start();
ap.setOnCompleteListener(new MediaPlayer.OnCompletionListener(){
public void onCompletion(MediaPlayer media){
int indx = buffer.indexOf(res);
if(buffer.size()-1>index){
ap = buffer.get(indx+1));
ap.start();
}
}
});
}
public static void addFile(final int res){
final MediaPlayer mp= MediaPlayer.create(this, res );
mp.setOnCompleteListener(new MediaPlayer.OnCompletionListener(){
public void onCompletion(MediaPlayer media){
int indx = buffer.indexOf(mp);
if(buffer.size()-1>index){
ap = buffer.get(indx+1));
ap.start();
}
}
});
buffer.add(mp);
}
}
答案 1 :(得分:1)
您可以尝试这种递归方法
MediaPlayer aP;
int i;
R[] rid = {R.raw.audio0,R.raw.audio1,R.raw.audio2,R.raw.audio3,R.raw.audio4};
private void clipSetup(final int end) {
aP = MediaPlayer.create(this, rid[i]);
aP.start();
if(i<end){
aP.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){
@Override
public void onCompletion(MediaPlayer mp){
clipSetup(end);
}
});
}
i++;
}
只需在要调用它的地方调用clipSetup(5)即可。其中5是序列中的最后一个数字
答案 2 :(得分:1)
尝试使用setDetaSource()。它看起来像这样:
@Override
public void onCompletion(MediaPlayer mp) {
if (currentPosition < sourceArray.size()) {
mediaPlayer.reset();
currentResId=currentResId==RESIDS.length-1?0:currentResId+1;
AssetFileDescriptor afd = context.getResources().openRawResourceFd(RESIDS[currentResId]);
if (afd == null) {
return;
}
mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mediaPlayer.start();
} else {
mediaPlayer.release();
}
}
但是你应该先创建RESIDS
数组。
您可以从原始资源创建它:
int[] RESIDS = {R.raw.audio1,R.raw.audio2,R.raw.audio3}
int currentResId=0;
您可能需要添加try-catch。 希望这会有所帮助。