2012-06-29 63 views
3

我正在開發一個應用程序,其中當一個新的活動開始時,它應該開始播放聲音。 所以我用mediaplayer在oncreate中播放聲音,它工作正常。但是當我嘗試使用soundpool時,通過在活動的創建中加載和播放它。 它不是在玩。 我選擇soundpool,因爲它比mediaplayer更好。可以在oncreate()中播放soundPool嗎?

可能是什麼問題?在創建時不會影響工作嗎?

+1

你可以在創建中使用soundpool ...並且請記住mediaplayer是播放大文件... soundpool是播放小嘀嗒聲等聲音... – Goofy

+0

我在播放一個像「welcome」這樣的小聲音當我點擊一個按鈕嘗試播放時,它工作正常。但是當我在創建時也一樣,它不工作。 – Aadi

+0

您可以在onCreate中創建soundpool時發佈您的實現以及如何使用它。 – Niko

回答

1

你可以在任何地方播放,

生病證明一個簡單的例子

創建方法initializeSoundPool

private void initializeSoundPool(){ 
     mSoundPool = new SoundPool(2, AudioManager.STREAM_MUSIC, 0); 
     mSoundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() { 
       public void onLoadComplete(SoundPool soundPool, int sampleId, 
         int status) { 
        loaded = true; 
       } 
      }); 
      soundID = mSoundPool.load(this, R.raw.glassbreak, 1);   
     } 

然後創建一個方法playFile

private void playFile(){ 
AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); 
     float actualVolume = (float) audioManager 
       .getStreamVolume(AudioManager.STREAM_MUSIC); 
     float maxVolume = (float) audioManager 
       .getStreamMaxVolume(AudioManager.STREAM_MUSIC); 
     float volume = actualVolume/maxVolume; 
     if (loaded) { 
      mSoundPool.play(soundID, volume, volume, 1, 0, 1f); 
      Log.e("Test", "Played sound"); 
     } 
} 

然後在onCreate稱他們爲l IKE在此

private SoundPool mSoundPool; 
    private int soundID; 
    boolean loaded = false; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.spxml); 
     initializeSoundPool(); 
      playFile(); 
    } 

甚至更​​好撥打onCreateinitializeSoundPool然後調用playFile在onResume

+0

我想在onCreate()之外調用initializesoundpool()和playfile()方法。但是當我嘗試播放聲音時。你能幫忙在這... –

2

或者,您可以覆蓋OnWindowFocusChanged活動開始時播放的文件...

事情是這樣的......

public class YourActivity extends Activity { 
    . 
    . 
    . 
    private Handler mHandler; 

    public void onCreate(Bundle savedInstanceState) { 
    . 
    . 
    . 
    this.mHandler = new Handler(); 

    . 
    . 
    . 

    } 



public void onWindowFocusChanged(boolean paramBoolean) 
     { 

if (paramBoolean) 
       { 
      this.mHandler.postDelayed(new Runnable() 
      { 
      public void run() 
      { 

       // Refer to the answer above to create the play function for your soundfile ... 


      YourActivity.this.play("The sound from the sound pool"); 
      } 
      } 
      , 1000L); 
     } 

}

2

也許你只是需要把睡在onCreate方法中。

我有幾乎同樣的問題,嘗試寫一個應用程序,有時會需要儘快,因爲它醒來時播放聲音。最終經過多次試驗和錯誤之後,我發現它在日誌輸出中輸入了錯誤「sample NOT READY」。問題在於加載聲音文件是異步發生的,如果您在加載之前嘗試播放聲音,則會失敗。

有按說,你可以使用一個叫做setOnLoadCompleteListener機制,但我還沒有看到這是如何真正有用的一個例子。在從mirroredAbstraction上面的例子中(假設它像宣傳的那樣),如果所有的聲音還沒有被加載,將發生的是,它不會播放聲音,這是幾乎一樣的,你現在有什麼。

如果比如神奇地「固定」你的問題,那麼我會認爲那只是因爲所有在這兩個方法的額外開銷來電基本上給你的聲音一次被播放之前加載。您可能已經在加載該遊戲的onCreate中使用簡單的SystemClock.sleep(100)獲得了相同的結果。

根據您的聲音的大小,可能需要延長的延遲,但有點具有不同的延遲實驗應該告訴你你需要多少。

+0

對不起,很晚回覆。 +1爲您的迴應。 我通過在異步線程中加載soundpools解決了這個問題,並且還使用setOnLoadCompleteListener()來檢查所有聲音庫是否在播放前加載。只需分享信息,您仍然在尋找解決方案。 :) – Aadi