Как обрабатывать исключения во время выполнения при воспроизведении аудио файлов? - PullRequest
1 голос
/ 15 марта 2010

У меня есть кнопка, которая воспроизводит аудиофайл на своем слушателе щелчка. Если кнопка воспроизводится снова и снова во время воспроизведения аудиофайла, приложение вылетает. Какое решение?

Вот код для справки:

 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 голосов
/ 15 марта 2010

Две вещи:
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, чтобы ваше приложение не зависало, но этот код должен дать вам общее представление о том, что делать.

...