2010-07-30 67 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); 
    }