Spl*_*usa 1 arrays android for-loop media-player
我目前正在尝试创建一个for循环,它将播放一个原始文件,当它完成后,它将继续到数组中的下一个声音文件.它目前正在播放所有文件.关于我如何解决这个问题的任何建议?我认为on on completion listener可能存在问题,但不确定.谢谢.
我的代码:
package com.example.mediatest;
int[] myMusic = {R.raw.caralarm, R.raw.phonebusysignal, R.raw.phoneoffhook};
MediaPlayer mp = new MediaPlayer();
for (int y =0; y<3; y++){
mp = MediaPlayer.create(this, myMusic[y]);
mp.start();
mp.setOnCompletionListener(new OnCompletionListener(){
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
}
});
}
Run Code Online (Sandbox Code Playgroud)
您可以创建单独的MediaPlayer对象,首先启动,然后onCompletion
启动下一个.对于可扩展的解决方案,请尝试以下方法:
int[] myMusic = {R.raw.caralarm, R.raw.phonebusysignal, R.raw.phoneoffhook};
int mCompleted = 0;
MediaPlayer mp = MediaPlayer.create(this, myMusic[0]);
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mCompleted++;
mp.reset();
if (mCompleted < myMusic.length()) {
try {
AssetFileDescriptor afd = getResources().openRawResourceFd(myMusic[mCompleted]);
if (afd != null) {
mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mp.prepare();
}
} catch (Exception ex) {
// report a crash
}
} else {
// done with media player
mp.release();
mp = null;
}
}
});
mp.start();
Run Code Online (Sandbox Code Playgroud)
一种更简单的方法(稍微浪费资源)是:
int[] myMusic = {R.raw.caralarm, R.raw.phonebusysignal, R.raw.phoneoffhook};
int mNext;
OnCompletionListener mListener = new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
startNextFile();
}
};
@Override
public void onCreate() {
// usual onCreate stuff here, then...
// either here or whenever you want to start the sequence
mNext = 0;
startNextFile();
}
void startNextFile() {
if (mNext < myMusic.length) {
MediaPlayer mp = MediaPlayer.create(this, myMusic[mNext++]);
mp.setOnCompletionListener(mListener);
mp.start();
}
}
Run Code Online (Sandbox Code Playgroud)