Android - 按钮点击播放声音 - 空指针异常

Chr*_*ris 42 android android-mediaplayer

我想点击一个按钮播放声音文件.声音只有1秒长.我点击按钮的前几次播放效果很好,但过了一会儿它会给出一个NullPointerException.这是代码:

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

这是例外:

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)
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 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();
                }

            });
Run Code Online (Sandbox Code Playgroud)

  • 似乎.setOnCompletionListener应该在.start之前而不是在(?)之后 (9认同)
  • 这应该在developper.android的教程中 (3认同)

小智 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);
     }
});
Run Code Online (Sandbox Code Playgroud)

  • 这似乎是在按钮点击时播放重复的短声音(而不是每次创建/销毁媒体播放器)时更好的方法.不要忘记在你的`onDestroy`(或者你正在清理Activity的任何地方)做一个`soundPool.release();`. (6认同)

soh*_*ilv 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();
    }
});
Run Code Online (Sandbox Code Playgroud)