Как обрабатывать исключение времени выполнения при воспроизведении аудиофайлов?

StackOverflow https://stackoverflow.com/questions/2445838

Вопрос

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

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

 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.Отладьте сбой и посмотрите, где происходит сбой (в какой строке).
2.Окружите весь оператор оператором try/catch и просто поймайте Исключение.

Если у вас есть исключение или вы лучше представляете, где ваш код дает сбой, вам будет гораздо проще дать вам совет, как это исправить...на самом деле, возможно, вам даже не понадобится совет, чтобы исправить это, вы можете в конечном итоге решить проблему самостоятельно, а затем пожнете плоды своего собственного успеха.

Обновление по комментариям:
Документация для Медиа плеер указывает, в чем может быть проблема, учитывая симптомы, которые видит ОП:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top