簡體   English   中英

MediaPlayer或SoundPool是否有多個短聲音?

[英]MediaPlayer or SoundPool for multiple short sounds?

該應用程序基本上允許用戶在單擊各種項目時播放動物聲音,語音或其他聲音。 我試圖找出是否以正確的方式執行此操作,因為當用戶靜音>取消靜音>播放聲音時,我遇到了類似此錯誤的問題:

java.lang.IllegalStateException at android.media.MediaPlayer.isPlaying(Native Method)

public class GuessActivity extends Activity implements PopupMenu.OnMenuItemClickListener {
    public static int[] ssSoundsArray = {R.raw.sbuffalo, R.raw.scamel, R.raw.scat, R.raw.schicken};
    public static int[] ssVoicesArray = {R.raw.buffalo, R.raw.camel, R.raw.cat, R.raw.chicken};
    MediaPlayer mMediaPlayer;
    Context context;
    ...
}

這是我如何使用MediaPlayer的示例:

    if(audio_all) {
        if(mMediaPlayer != null) {
            if(mMediaPlayer.isPlaying()) {
                mMediaPlayer.stop();
                mMediaPlayer.release();                
            }
        }

        mMediaPlayer = MediaPlayer.create(this, R.raw.whatever);
        mMediaPlayer.start();
        mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            public void onCompletion(MediaPlayer mediaPlayer) {
                mMediaPlayer.release();
                mMediaPlayer = null;
            }
        });
    }

我對不同的按鈕等做了多次,請確保它們完成后釋放(),因為我之前遇到過內存問題。 所以上面的異常告訴我isPlaying()無效,因為MediaPlayer不存在,但由於某種原因,它忽略了if(mMediaPlayer != null)

如果正在播放任何內容,則必須停止播放,因為用戶可以隨意單擊,並且我當然不希望任何聲音相互疊加。

用戶靜音的方法如下:

case R.id.action_toggle_sounds:
            if(audio_all) {

                if(mMediaPlayer != null) {
                   if(mMediaPlayer.isPlaying()) {
                   mMediaPlayer.stop();
                   mMediaPlayer.release();                
                   }
                }

                Toast.makeText(this,"All sounds disabled",Toast.LENGTH_LONG).show();
                audio_all = false;
            } else {
                Toast.makeText(this,"All sounds enabled",Toast.LENGTH_LONG).show();
                audio_all = true;
            }
            return true;

我非常感謝您對此提供的任何幫助,非常感謝!

如果沒有太多曲目要播放(不超過32條),則可以嘗試初始化多個MediaPlayer實例,然后僅在調用app onPause()/ onStop()時釋放它們。 然后,您將可以使用MediaPlayer's池。 您只需要記住當前正在使用哪一個即可。

同樣,如果您在多個線程(不僅是UI線程)中使用MediaPlayer,則必須使用互斥(線程阻塞)以避免問題。

基於MediaPlayer的狀態機-IllegalStateException基本上意味着,不允許調用isPlaying()時,播放器實例處於狀態。 對於記錄的isPlaying()不允許的狀態僅為Error狀態,但是在調用release()之后假定狀態可能也不適合此狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM