【问题标题】:Android - play sound on button click - Null pointer exceptionAndroid - 单击按钮时播放声音 - 空指针异常
【发布时间】:2011-03-23 02:17:35
【问题描述】:

我正在尝试通过单击按钮来播放声音文件。声音只有 1 秒长。我点击按钮的前几次播放效果很好,但过了一会儿它给出了NullPointerException。代码如下:

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)

【问题讨论】:

  • 不确定是否有帮助,但也许可以在完成时尝试 mp.reset()?
  • 如果你想自动管理资源,以便你可以调用MusicManager.getInstance().play(this, R.raw.my_sound);等,这个库可能适合你:github.com/delight-im/Android-Audio

标签: android android-mediaplayer


【解决方案1】:

感谢您的回答!欣赏!

这是我最终设法让它工作的方法:

            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();
                }

            });

【讨论】:

  • 似乎 .setOnCompletionListener 应该在 .start 之前而不是之后 (?)
  • 更改了调用顺序
  • 这个应该在developper.android的教程里
  • 简单且工作起来就像一个魅力。正是我的情况所需要的。虽然对于像 1 秒这样的短声音,我可能会选择 SoundPool 而不是 MediaPlayer。无论如何谢谢!
【解决方案2】:

你也可以试试:

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);
     }
});

【讨论】:

  • 在点击按钮时播放重复的短声音(而不是每次都创建/销毁媒体播放器),这似乎是更好的方法。不过,不要忘记在您的onDestroy(或您要清理活动的任何地方)中执行soundPool.release();
  • @Alconja 根据我的经验,不能保证 onDestroy 会被实际调用(即 Android 任务杀手通常会在没有警告的情况下杀死我的应用程序)。
  • @Michael 每当应用程序以这种方式被杀死时,通常不需要释放资源,因为您的整个进程都会终止,并且它打开和分配的所有内容都会由系统自动关闭和释放。
【解决方案3】:

它可能会解决你的问题,

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();
    }
});

【讨论】:

  • 前几次单击仍然可以正常工作,然后给出空指针异常,尤其是当我连续快速单击按钮时。
  • 你能试试吗,1)在开始之前先检查一下。我的意思是检查播放器是否处于播放阶段,然后不要执行此语句 mp = MediaPlayer.create(Test.this, R.raw.mysound); mp.start();或 2) 将 mp 设为局部变量
【解决方案4】:

你应该捕获异常。

试试这个代码:

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

【讨论】:

    【解决方案5】:

    如果您的问题仍未解决,请尝试此方法,因为它对我有帮助。

        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();
    
        }
    

    享受。 :)

    【讨论】:

      猜你喜欢
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多