我试图在“res / raw”文件夹中播放android中的声音。但它只播放声音阵列中的第一个声音。还有其他办法吗?
原始文件夹中有三个声音文件
1.aa.ogg 2.ma.ogg 3.ar.ogg
package com.protonray.calculatorplus;
import java.util.List;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.app.Activity;
public class LayoutNew extends Activity{
int count=0;
int[] sounds={R.raw.aa,R.raw.ma,R.raw.ar };
MediaPlayer mp=new MediaPlayer();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_new);
Button play=(Button) findViewById(R.id.play);
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
count =0 ;
//Play the Frist sound
mp =MediaPlayer.create(LayoutNew.this,sounds[count]);
mp.start();
count =1 ;
}
});
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
if(count<3){
mp.stop();
//Play next sound
mp =MediaPlayer.create(LayoutNew.this,sounds[count]);
mp.start();
count++;
}
}
});
}
}
答案 0 :(得分:1)
看看setNextMediaPlayer。这应该可以满足您的需求。
只需在onClick
中创建3个媒体播放器(每个声音文件一个),然后将前两个文件的下一个播放器设置为下一个文件的播放器,例如:
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
for ( int snd = 0; snd < 3; snd++ ) {
mp[snd] = MediaPlayer.create( LayoutNew.this, sounds[snd] );
}
for ( int snd = 0; snd < 2; snd++ ) {
mp[snd].setNextMediaPlayer( mp[snd+1] );
}
);
您还应该在完成后释放所有3个媒体播放器(通过在每个媒体播放器上调用release()
)。这可以通过向最后媒体播放器仅(即onCompletion
)添加mp[2]
处理程序来轻松完成,以便它执行一次清理所有3个声音都已完成播放。
OnCompletionListener
,目前它只会在第一个和第二个声音结束时触发而不是第二个。试试这段代码:
MediaPlayer mp;
play.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View arg0) {
mp = MediaPlayer.create( LayoutNew.this, sounds[0] );
mp.start();
mp.setOnCompletionListener( new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.dispose();
mp = MediaPlayer.create( LayoutNew.this, sounds[1] );
mp.start();
mp.setOnCompletionListener( new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.dispose();
mp = MediaPlayer.create( LayoutNew.this, sounds[2] );
mp.start();
mp.setOnCompletionListener( new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
mp.dispose();
mp = null;
}
});
}
});
}
});
}
}
我没有测试这段代码,但它应该可行。要避免这种情况的关键是每次创建新的MediaPlayer时都需要调用setOnCompletionListener
,以便新实例在完成时通知您。
另外,因为你要在onClick
(一次性)中设置所有内容,所以除非你真的想要或者有其他充分的理由,否则你不需要使用计数器。无论哪种方式,这应该充分说明你做错了什么,以及如何做到这一点。
答案 1 :(得分:0)
只需根据您的代码判断,请尝试将mp.setOnCompletionListener
放在onClick
内。此外,我认为您不需要mp.stop