3

私は、新しいアクティビティが開始されると、サウンドの再生を開始する必要があるアプリに取り組んでいます。そのため、mediaplayer を使用して oncreate でサウンドを再生したところ、問題なく動作しました。しかし、代わりにsoundpoolを使用しようとしたとき、アクティビティのoncreateでロードして再生しました。再生されていません。mediaplayerよりも優れているため、soundpoolを選択します。

何が問題なのですか?oncreate で soundpool は動作しませんか?

4

3 に答える 3

2

おそらく、onCreate メソッドにスリープを入れる必要があるだけです。

ウェイクアップするとすぐにサウンドを再生する必要があるアプリを作成しようとすると、ほとんど同じ問題が発生しました。最終的に多くの試行錯誤の末、ログ出力に「sample NOT READY」というエラーが表示されていることがわかりました。問題は、サウンド ファイルのロードが非同期に行われることでした。ロードされる前にサウンドを再生しようとすると失敗します。

setOnLoadCompleteListener というメカニズムを使用できると思われますが、これが実際にどのように役立つかを示す例はまだ見ていません。上に示した mirroredAbstraction の例 (広告どおりに動作すると仮定) では、サウンドがまだロードされていない場合に起こることは、サウンドが再生されないことだけです。これは、現在のものとほとんど同じです。

その例がどういうわけか魔法のように問題を「修正」した場合、それは2つのメソッド呼び出しのすべての余分なオーバーヘッドが、基本的にサウンドが再生される前にロードする時間を与えるためだと思います。ロードとプレイの間に onCreate で単純な SystemClock.sleep(100) を使用して、おそらく同じ結果を達成できたはずです。

サウンドのサイズによっては、遅延を長くする必要があるかもしれませんが、さまざまな遅延を少し試してみると、必要な量がわかります。

于 2012-12-17T09:57:52.413 に答える
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);
      }

}

于 2012-07-09T12:26:15.287 に答える
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();
    }

または、を呼び出しinitializeSoundPoolonCreateから、でplayFileを呼び出すことをお勧めしonResumeます。

于 2012-06-29T06:58:17.253 に答える