如何处理播放音频文件的运行时异常?

时间:2010-03-15 08:32:10

标签: java android audio android-mediaplayer

我有一个按钮,可以在其点击监听器上播放音频文件。如果在播放音频文件时反复单击该按钮,则应用程序崩溃。解决方案是什么?

以下是一些供参考的代码:

 private OnClickListener btnMercyListener = new OnClickListener()
    {

        public void onClick(View v)
        {                        
           // Toast.makeText(getBaseContext(), 
             //       "Mercy audio file is being played", 
               //       Toast.LENGTH_LONG).show();

            if (status==true)
            {
                mp.stop();
                mp.release();
                status = false;

            } 
            else
            {
            mp = MediaPlayer.create(iMEvil.this,R.raw.mercy); 


          //mp.start();

            try{
                mp.start();
                status= true; 
                //mp.release();
               }catch(NullPointerException e)
               {
                   Log.v("MP error",e.toString());
               }

            }

            mp.setOnCompletionListener(new OnCompletionListener(){ 

                   // @Override 
                   public void onCompletion(MediaPlayer arg0) { 
                      mp.release();
                      status = false;

                   } 
              }

          ); 



        }
    };

1 个答案:

答案 0 :(得分:0)

两件事:
1.调试崩溃并查看它失败的位置(哪一行) 2.使用try / catch环绕整个语句,然后只需捕获Exception

如果你有一个例外或更好的想法代码失败的地方,那么就如何解决它提供建议会更容易......事实上,你可能甚至不需要建议来解决它,你最终可能会自己解决问题,然后你将获得自己成功的成果。

每条评论更新:
MediaPlayer的文档表明了OP看到的症状可能是什么问题:

  

要停止播放,请拨打stop()。如果您希望以后重播媒体,那么   在致电之前,您必须reset()prepare() MediaPlayer对象   再次start()。 (create()第一次调用prepare()。)

看起来如果按下播放按钮的次数太多,那么媒体可能最终没有处于准备状态,从而引发一些异常。禁用播放按钮的想法是有效的,它应该处理这种情况。

以下是您希望程序执行操作的一些说明性代码:

private OnClickListener btnMercyListener = new OnClickListener()
{
    public void onClick(View v)
    {
        if(isPressed)
        {
            return;
        }

        isPressed = true;

        // create your media player
        mp = MediaPlayer.create(iMEvil.this,R.raw.mercy); 

        // set your listener
        mp.setOnCompletionListener(mp.setOnCompletionListener(new OnCompletionListener(){ 

            // @Override 
            public void onCompletion(MediaPlayer arg0) {
                    if(!isPressed)
                    {
                        return;
                    }

                    isPressed = false;

                    // re-enable your play button
                    playButton.enable();

                    // disable the pause button
                    pauseButton.disable();

                    mp.release();
                    mp.prepare();
                } 
            }
        );

        // disable the play button
        playButton.disable();

        // enable the pause button
        pauseButton.enable();

        // start playback
        mp.start();
    }
};

当然你应该在那里有适当的try / catch语句,这样你的应用程序就不会崩溃,但是这段代码可以让你大致了解该怎么做。