在我的應用程序中,我爲圖像設置動畫,每當它達到某個點時,我都想用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