在Android的循环声音文件?
问题描述:
此代码在初始循环中正常工作。但是,一旦我停下来再次敲击循环按钮,文件就会混乱起来,并且按顺序播放。任何人都有线索是什么错误?任何帮助,将不胜感激。在Android的循环声音文件?
public class OneExp extends ActionBarActivity {
private ListView lv;
private ArrayAdapter<String> arrayAdapter;
private MediaPlayer mp;
private MediaPlayer mp2;
int[] myAudio = {R.raw.e_1101, R.raw.e_1102, R.raw.e_1103, R.raw.e_1104, R.raw.e_1105,
R.raw.e_1106, R.raw.e_1107, R.raw.e_1108, R.raw.e_1109, R.raw.e_1110, R.raw.e_1111};
int mCompleted = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.one_exp);
Button btnLoop = (Button) findViewById(R.id.button1);
Button btnStop = (Button) findViewById(R.id.button2);
btnStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (mp2 != null) {
if (mp2.isPlaying()) {
mp2.stop();
}
mp2.reset();
mp2.release();
mp2 = null;
}
}
});
btnLoop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
mp2 = MediaPlayer.create(getBaseContext(), myAudio[0]);
mp2.setOnCompletionListener(new OnCompletionListener()
{
@Override
public void onCompletion(MediaPlayer mp2)
{
mCompleted++;
mp2.reset();
if (mCompleted < myAudio.length)
{
try
{
AssetFileDescriptor afd = getResources().openRawResourceFd(myAudio[mCompleted]);
if (afd != null)
{
mp2.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mp2.prepare();
mp2.start();
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
else if (mCompleted>=myAudio.length)
{
mCompleted =0;
try
{
AssetFileDescriptor afd = getResources().openRawResourceFd(myAudio[mCompleted]);
if (afd != null)
{
mp2.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mp2.prepare();
mp2.start();
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
else
{
mCompleted=0;
mp2.release();
mp2 = null;
}
}
});
mp2.start();
}
});
答
看一看http://developer.android.com/reference/android/media/MediaPlayer.html#setLooping(boolean
你为什么要使用这么多的代码时,你可以轻松地使用的start(),停止(),暂停()和setLooping(真)呢?
据我所见,没有必要检查音频的长度。
当您在稍后的start()中调用pause()时,您的音频将继续在原来的位置。
只有当您完全使用该文件时才能呼叫释放/重置。
我想循环一系列文件,而不仅仅是一个。你如何设置一个例如连续三个文件的循环,并重复所有三个,直到我推停止? – user3623689
我会做一个正常的FOR()循环。如果只有3个文件,它们会在同一时间停止,而不会有任何明显的延迟。 – Riverside