2012-03-27 71 views
1

我已經做了像用戶點擊按鈕然後聲音播放。但是現在我無法在點擊後聽到聲音。我不知道爲什麼?Android:爲什麼我點擊後無法播放按鈕上的聲音?

這是我用來播放聲音的代碼。

代碼:

case R.id.lockView: 
     playSound(R.raw.dooropen); 
     break; 
    } 

public void playSound(int resources){ 
    boolean mStartPlaying = true; 
    if (mStartPlaying==true){ 
     mPlayer = new MediaPlayer(); 
     Uri uri = Uri.parse("android.resource://com.project.iMystick/" + resources); 
     try{ 
      mPlayer.setDataSource(getApplicationContext(),uri); 
      mPlayer.prepare(); 
      mPlayer.start(); 
     } 
     catch (IOException e){ 
      Log.e(LOG_TAG, "prepare() failed"); 
     } 
    } 
    else{ 
     // stopPlaying(); 
     //rePlay.setText("Replay"); 
     mPlayer.release(); 
     mPlayer = null; 
    } 
    mStartPlaying = !mStartPlaying; 
} 

而且一些點擊後,我得到了在logcat的這種類型的錯誤消息:

登錄:

03-27 16:15:02.737: ERROR/MediaPlayer(1057): Error (-19,0) 
03-27 16:15:03.858: DEBUG/AudioSink(34): bufferCount (4) is too small and increased to 12 
03-27 16:15:03.858: ERROR/AudioFlinger(34): not enough memory for AudioTrack size=32832 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): AudioTrack (0x12abf8, size=1048576) 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):  0: 0012ac10 | 0x00000000 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):  1: 0012aca0 | 0x00008040 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):  2: 0012b5a8 | 0x00010080 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):  3: 0012bec8 | 0x000180C0 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):  4: 0012c7f0 | 0x00020100 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):  5: 0012d1f0 | 0x00028140 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):  6: 0012db20 | 0x00030180 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):  7: 00136448 | 0x000381C0 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):  8: 0013ee00 | 0x00040200 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34):  9: 0000de10 | 0x00048240 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): 10: 0012b708 | 0x00050280 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): 11: 00022c70 | 0x000582C0 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): 12: 000234c0 | 0x00060300 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): 13: 00115e38 | 0x00068340 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): 14: 00117a80 | 0x00070380 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): 15: 00118798 | 0x000783C0 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): 16: 00042228 | 0x00080400 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): 17: 0004bd48 | 0x00088440 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): 18: 00055998 | 0x00090480 | 0x00008040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): 19: 0005f5f0 | 0x000984C0 | 0x00003040 | A 
03-27 16:15:03.858: DEBUG/MemoryDealer(34): 20: 000712b0 | 0x0009B500 | 0x00008040 | A 
03-27 16:15:03.867: ERROR/AudioTrack(34): AudioFlinger could not create track, status: -12 
03-27 16:15:03.867: ERROR/AudioSink(34): Unable to create audio track 
03-27 16:15:03.877: ERROR/MediaPlayer(1057): error (-19, 0) 

enter code here 

回答

4

你需要釋放()的媒體播放器,否則資源不釋放,並且很快你就會失去記憶(因爲你下次再分配它們)。 所以,我認爲你可以播放兩次甚至三次......但沒有多次釋放資源

建議一旦MediaPlayer對象不再被使用,立即調用release()以便使用資源通過與MediaPlayer對象關聯的內部播放器引擎可以立即釋放。資源可能包括硬件加速組件等單體資源,以及調用release()失敗可能導致MediaPlayer對象的後續實例退回到軟件實現或完全失敗。 See this link

+0

是的謝謝。它解決了我的問題 – 2012-03-27 12:00:21

1

我認爲問題是,你didint等到第一個完成(或停止它)開始第二個.. 嘗試收聽前一個完成時,然後啓動下一個..你可能會使用setOnCompletio nListener。

類似的問題: android playing two songs problem

代碼:

package ooo.iii; 

    import java.io.IOException; 


    import android.app.Activity; 
    import android.media.MediaPlayer; 
    import android.net.Uri; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.widget.Button; 

    public class Test_audioActivity extends Activity { 
     /** Called when the activity is first created. */ 
     Button btn; 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
    //  setContentView(R.layout.main); 
      setContentView(R.layout.main); 
      btn=(Button)findViewById(R.id.ss); 

      btn.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        playSound(R.raw.musi); 

       } 
      }); 

     } 



    public void playSound(int resources){ 
     try{ 
     boolean mStartPlaying = true; 
     MediaPlayer mPlayer=null; 
    if (mStartPlaying==true){ 

      mPlayer = new MediaPlayer(); 
     Uri uri = Uri.parse("android.resource://ooo.iii/" + resources); 

      mPlayer.setDataSource(getApplicationContext(),uri); 
      mPlayer.prepare(); 
      mPlayer.start(); 

    } 
    else{ 
     // stopPlaying(); 
     //rePlay.setText("Replay"); 
     mPlayer.release(); 
     mPlayer = null; 
    } 
    mStartPlaying = !mStartPlaying; 


    } 
    catch (IOException e){ 
     Log.e("ERR", "prepare() failed"); 
    } 
    } 



} 

你需要改變:

1-源@ RES /生/穆西..到你

2- res/layout/main.xml中按鈕的id從ss到你的..

3 Uri uri = Uri.parse(「android.resource://ooo.iii/」+ resources);修復包名到你

這就是全部。我測試了真實的設備,然後點擊多次,並獲得新的聲音上面以前仍處於播放狀態

+0

我得到了你的觀點,但如果想連打它第二次如果它不停止呢? – 2012-03-27 11:00:51

+0

在這種情況下..使用mediaplayer的另一個實例..重點是,如果它與其他東西忙碌不要使用相同的對象.. – 2012-03-27 11:03:07

+0

好吧那麼它對我有用嗎?我的意思是,如果我繼續點擊同一個按鈕呢? – 2012-03-27 11:07:29

1

MediaPlayer的設計目的並不在於您試圖使用它的方式。這就是爲什麼你面臨這個問題。

MediaPlayer正在`不是一個好的選擇當你在打小的聲音效果,用戶可以很快的多個按鈕點擊,你必須創建爲所有這些不同步發生一個MP物體和只要你點擊按鈕。去SoundPool類,它允許您保持較小的聲音加載到內存中,並且您可以隨時播放它們,而不會在媒體播放器中感受到任何延遲。http://developer.android.com/reference/android/media/SoundPool.html這裏是一個很好的教程:http://www.anddev.org/using_soundpool_instead_of_mediaplayer-t3115.html

+0

感謝您的答案,但我已經解決了這個問題。 – 2012-03-27 12:46:34

+0

如果可以,請使用soundPool。多媒體播放器實例將開始落後於處理能力較低的手機。我遇到了問題,不得不切換到SoundPool – Akhil 2012-03-27 17:08:34

0

我有同樣的問題,我解決它通過使用release()方法的OnCompletionListener:

MediaPlayer mp = MediaPlayer.create(getApplicationContext(), resource); 
     mp.start(); 
     mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mp) { 
       mp.release(); 
      } 
     }); 
相關問題