2014-09-28 58 views
0

在我的應用程序中,我爲圖像設置動畫,每當它達到某個點時,我都想用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()從一個線程是負責編製成SurfaceViewCanvas的。

我增加了一個OnCompletionListener,一個OnInfoListenerOnErrorListener到我的線程加上原木的需求的發射和聲音的開始,一切似乎OK:需求製成,聲音啓動,聲音完成並重新啓動循環。我從來沒有給我的onInfo也沒有接到我的onError功能,但聲音有時還沒有發出。它真的好像MediaPlayer是越野車...

+0

您能告訴我們一些代碼嗎?通過閱讀這些內容無法告訴你正在做什麼。 – vlatkozelka 2014-09-28 15:22:44

回答

0

使用而不是MediaPlayer解決了我的問題!