在我的应用程序中,我为图像设置动画,每当它达到某个点时,我都想用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()
从一个线程是负责编制成SurfaceView
的Canvas
的。
我增加了一个OnCompletionListener
,一个OnInfoListener
和OnErrorListener
到我的线程加上原木的需求的发射和声音的开始,一切似乎OK:需求制成,声音启动,声音完成并重新启动循环。我从来没有给我的onInfo
也没有接到我的onError
功能,但声音有时还没有发出。它真的好像MediaPlayer
是越野车...
您能告诉我们一些代码吗?通过阅读这些内容无法告诉你正在做什么。 – vlatkozelka 2014-09-28 15:22:44