2010-07-30 95 views
41

我試圖播放一個聲音文件上點擊一個按鈕。聲音只有1秒。它在前幾次單擊按鈕時發揮很好,但過了一段時間後,它會顯示NullPointerException。下面的代碼:Android - 按鈕點擊播放聲音 - 空指針異常

button[i].setOnClickListener(new OnClickListener() { 
    public void onClick(View view) {   
     mp = MediaPlayer.create(Test.this, R.raw.mysound); 
     mp.start(); 
    } 
}); 

而這裏的例外:

07-29 23:07:27.690: ERROR/AndroidRuntime(10542): Uncaught handler: thread main exiting due to uncaught exception 
07-29 23:07:27.710: ERROR/AndroidRuntime(10542): java.lang.NullPointerException 
07-29 23:07:27.710: ERROR/AndroidRuntime(10542):  at com.example.mypackage.Test$3.onClick(Test.java:270) 
+3

不知道是否有幫助,但也許嘗試完成一個mp.reset()? – 2010-07-30 06:40:54

+0

是的,它幫助!謝謝! – Chris 2010-07-30 06:57:35

+0

如果您想自動管理資源,以便您可以調用'MusicManager.getInstance()。play(this,R.raw.my_sound);'等等,該庫可能適合您:https:// github .com/delight-im/Android-Audio – caw 2015-04-01 22:33:42

回答

4

它可能會解決你的問題,

button[i].setOnClickListener(new OnClickListener() { 
    public void onClick(View view) {  
     new Thread(){ 
      public void run(){ 
       mp = MediaPlayer.create(Test.this, R.raw.mysound); 
       mp.start(); 
     }.start(); 
    } 
}); 
+0

對於前幾次點擊仍然正常工作,然後給出空指針異常,特別是當我連續快速點擊按鈕時。 – Chris 2010-07-30 06:27:21

+0

你可以試試, 1)在開始前進行檢查。我的意思是檢查玩家是否在玩階段,然後不執行這個聲明 mp = MediaPlayer.create(Test.this,R.raw.mysound); mp.start(); 或 2)使熔點爲局部變量 – sohilv 2010-07-30 06:41:36

101

感謝您的答案!欣賞它!

下面是如何我終於設法得到它的工作:

  button[i].setOnClickListener(new OnClickListener() { 
       public void onClick(View view) { 

        mp = MediaPlayer.create(Test.this, R.raw.mysound); 
        mp.setOnCompletionListener(new OnCompletionListener() { 

         @Override 
         public void onCompletion(MediaPlayer mp) { 
          // TODO Auto-generated method stub 
          mp.release(); 
         } 

        }); 
        mp.start(); 
       } 

      }); 
+9

看起來也許.setOnCompletionListener應該來的。開始不後(?) – 2011-09-01 06:21:56

+0

我瑞恩同意了。 – Carcamano 2012-06-22 17:26:43

+0

改變了電話的順序 – WarrenFaith 2012-08-14 08:34:43

0

如果仍無法解決您的問題,然後再嘗試這個,因爲它幫助我。

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

       Uri uri = Uri.parse("android.resource://YOUR_PACKAGENAME/" + resources); 
       mPlayer.setDataSource(getApplicationContext(),uri); 
       mPlayer.prepare(); 
       mPlayer.start(); 
      } 
      else{ 
       mPlayer.release(); 
       mPlayer = null; 
      } 
      mStartPlaying = !mStartPlaying; 
     } 
     catch (IOException e){ 
      Log.e(LOG_TAG, "prepare() failed"); 
     } 

//  MediaPlayer mp = MediaPlayer.create(SpyMainActivity.this, resources); 
//  mp.start(); 

    } 

享受。 :)

24

你還可以嘗試:

final soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0); 
final sound = soundPool.load(this, R.raw.mysound, 1); 

button[i].setOnClickListener(new OnClickListener() 
{ 
    public void onClick(View view) 
    {  
     soundPool.play(sound, 1.0f, 1.0f, 0, 0, 1.0f); 
    } 
}); 
+6

看起來像這樣是在單擊按鈕時播放重複短暫聲音(而不是每次創建/銷燬媒體播放器)時更好的方法。不過,不要忘記在你的'onDestroy'(或者你正在清理Activity的地方)做一個'soundPool.release();'。 – Alconja 2013-08-19 01:43:47

+0

@Alconja根據我的經驗,沒有任何保證可以實際調用onDestroy(即Android任務殺手通常會在沒有警告的情況下殺死我的應用)。 – Michael 2014-04-09 19:16:49

+0

@Michael每當應用程序以這種方式死亡時,通常不需要取消分配資源,因爲您的整個進程終止並且它已打開並分配的所有內容都將被系統自動關閉和釋放。 – Grishka 2015-12-26 01:54:20

1

你應該捕獲異常。

試試這個代碼:

 try{ 
     MediaPlayer mplayer = MediaPlayer.create(contextTop, R.raw.<your sound>); 
     mplayer.start(); 
    }catch(Exception e){ 
     Log.d("<your TAG here>" , "error: " + e); 
    }