可以在oncreate()中播放soundPool吗?

时间:2012-06-29 04:27:54

标签: java android android-activity soundpool

我正在开发一款应用,其中当新活动开始时,它应该开始播放声音。 所以我用mediaplayer在oncreate中播放声音并且工作正常。但是,当我尝试使用soundpool时,通过在活动的oncreate中加载和播放它。 它不玩。 我选择soundpool,因为它比mediaplayer更好。

可能是什么问题?是不是在oncreate中使用soundpool工作?

3 个答案:

答案 0 :(得分: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);
      }

}

答案 1 :(得分:2)

也许你只需要在onCreate方法中进行一次睡眠。

我尝试编写一个有时需要在它醒来时播放声音的应用程序时遇到了同样的问题。经过多次试验和错误后,我发现它在日志输出中输入错误“sample NOT READY”。问题是加载声音文件是异步发生的,如果你试图在声音加载之前播放它就会失败。

据说你可以使用一种名为setOnLoadCompleteListener的机制,但我还没有看到一个如何实际使用它的例子。在上面显示的示例中,mirroredAbstraction(假设它的工作方式与广告一样)如果声音未加载,那么所有会发生的声音就是它不会播放声音,这与你现在的声音非常相似。

如果那个例子以某种方式神奇地“修复”了你的问题,那么我建议只是因为两个方法调用中的所有额外开销基本上都会让你的声音时间在播放之前加载。你可能在加载游戏之间的onCreate中使用简单的SystemClock.sleep(100)获得了相同的结果。

根据您的声音大小,您可能需要延长延迟,但是一些不同延迟的实验应该告诉您需要多少。

答案 2 :(得分: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中称呼他们

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

或者更好地致电initializeSoundPool中的onCreate,然后在onResume中调用playFile。