2011-03-09 256 views
0

我有一個媒體播放器類的小問題。我有一個按鈕,按下它會播放聲音。問題是,當我按下按鈕和播放聲音時,如果我按了很多次媒體播放器死機,然後沒有聲音播放,我得到以下錯誤:mediaplayer死亡android

ERROR/MediaPlayer(3960): error (-19, 0) 
ERROR/AudioTrack(3931): AudioFlinger could not create track, status: -12 
ERROR/AudioSink(3931): Unable to create audio track 

下面的代碼:

Button b = (Button)findViewById(R.id.button); 
     b.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       AssetFileDescriptor afd; 
       try { 

        afd = getAssets().openFd("bassdrum6.mp3"); 
        player = new MediaPlayer(); 
        player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()); 
        player.prepare(); 
        player.start(); 

       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 

我不知道什麼是錯在這裏。我需要一些幫助。

在此先感謝。

回答

0

你會想,如果你想在按鈕被按下

Button b = (Button)findViewById(R.id.button); 
b.setOnTouchListener(new View.OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (global.toggleOnOff == false) { 

      if (event.getAction() == MotionEvent.ACTION_DOWN) { 
       //what you want to happen when they touch the button 
      } 
      else if(event.getAction() == MotionEvent.ACTION_UP) { 
       //what you want to happen when they let go of the button 
      } 
     } 

     return false; 
    } 
}); 
+0

我也會使用聲音池而不是媒體播放器。這會照顧你的錯誤。這裏有一個關於如何使用它的好教程。 http://thenewboston.org/watch.php?cat=6&number=79 – MinceMan 2011-12-30 14:05:41

1

可能因爲您同時創建了多個MerdiaPlayer對象(我期望Android API代碼應該能夠很好地處理這個問題)。 總而言之,您可以在您的代碼中建立一個檢查來驗證mediaplayer是否已經創建。 舉一個很好的例子: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/media/MediaPlayerDemo_Video.html

另外,最好是擴展你的實現,以便在它完成它的工作時釋放mediaplayer。就像清理之後的對象被釋放。

+0

感謝您的回答也發揮觸摸監聽使用。我會看看它。 – madcoderz 2011-03-09 14:38:30

+0

以及關於媒體播放器死亡的問題已修復。但是當我播放聲音時我仍然會延遲。我剛纔發現,當按鈕被釋放而不是按下時,播放聲音。有什麼辦法可以解決這個問題嗎? – madcoderz 2011-03-09 15:41:12

+0

是不是因爲onclick甚至只在完成點擊循環後纔會觸發? – 2013-02-15 16:27:16