在我的应用程序中,我为图像设置动画,每次到达某一点时,我都希望使用MediaPlayer
播放声音。声音是使用sound=MediaPlayer.create
创建的,并以sound.start()
开头。我的问题是声音并不总是播放:虽然它通常是正确播放的,但有时会丢失或缩短。 Android版本4.4中出现此问题,而4.3版本则没有。
首先,我的声音是从UI线程发出的。然后我尝试在第二个线程中管理它,但没有任何改进。我该怎么办?
以下是我专用线程中编写的代码:
private class EmitSound extends Thread implements OnCompletionListener,OnInfoListener,OnErrorListener{
private MediaPlayer sound;
private boolean killProcess=false;
private Boolean emitSound=false;
public EmitSound (){
sound=MediaPlayer.create(myActivity,R.raw.sound);
sound.setOnCompletionListener(this);
sound.setOnInfoListener(this);
sound.setOnErrorListener(this);
}
public void run(){
while(!killProcess){
synchronized(emitSound){
if(emitSound){
Logger.getLogger("MyApp").log(Level.Info,"Sound started");
sound.start();
emitSound=false;
}
}
}
}
public void EmitSound(){
synchronized(emitSound){
emitSound=true;
Logger.getLogger("MyApp").log(Level.Info,"Demand");
}
}
public void KillProcess(){
sound.release();
killProcess=true;
}
@Override
public void onCompletion(MediaPlayer mp) {
Logger.getLogger("MyApp").log(Level.INFO,"Sound finished");
}
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
Logger.getLogger("MyApp").log(Level.INFO,"Info "+Integer.toString(what)+" / "+Integer.toString(extra));
return false;
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Logger.getLogger("MyApp").log(Level.INFO,"Error "+Integer.toString(what)+" / "+Integer.toString(extra));
return false;
}
}
当我想发出声音时,我从负责绘制myProcess.EmitSound()
Canvas
SurfaceView
的线程中调用OnCompletionListener
。
我已经在我的帖子中添加了OnInfoListener
,OnErrorListener
和onInfo
以及用于发出请求和声音开始的日志,一切似乎都可以:a需求,声音开始,声音完成,循环重新开始。我从来没有接到我的onError
和我的MediaPlayer
功能的电话,但声音有时仍未发出。看起来{{1}}似乎是错误的......
答案 0 :(得分:0)
使用SounPool
代替MediaPlayer
解决了我的问题!