Ernesto Rodriguez Ernesto Rodriguez - 5 months ago 28
Android Question

MediaPlayer exception on finsh activity

I´m getting an exeption when I try to finish the mediaplayer activity (only when I playing). The code:

Finish button:

ImageView imageAllBack = (ImageView)this.findViewById(R.id.imageAllBack);
imageAllBack.setOnClickListener(new OnClickListener() {
public void onClick(View v) {

//mediaPlayer.stop();
if(mediaPlayer != null)
{
mediaPlayer.stop();
mediaPlayer.release();
}

finish();

}
});


MediaPlayer events:

@Override
protected void onStop() {
super.onStop();
mediaPlayer.stop();
mediaPlayer.release();
}

@Override
public boolean onTouchEvent(MotionEvent event) {
mediaController.show();
return false;
}

//--MediaPlayerControl methods----------------------------------------------------
public void start() {

mediaPlayer.start();
}

public void pause() {
mediaPlayer.pause();
}

public int getDuration() {
return mediaPlayer.getDuration();
}

public int getCurrentPosition() {

return mediaPlayer.getCurrentPosition();

}

public void seekTo(int i) {
mediaPlayer.seekTo(i);
}

public boolean isPlaying() {
return mediaPlayer.isPlaying();
}

public int getBufferPercentage() {
return 0;
}

public boolean canPause() {
return true;
}

public boolean canSeekBackward() {
return true;
}

public boolean canSeekForward() {
return true;
}
//--------------------------------------------------------------------------------

public void onPrepared(MediaPlayer mediaPlayer) {
mediaController.setMediaPlayer(this);
mediaController.setAnchorView(findViewById(R.id.main_audio_view));

handler.post(new Runnable() {
public void run() {
mediaController.setEnabled(true);
mediaController.show();
}
});
}

public class MyMediaController extends MediaController {

public MyMediaController(Context context) {
super(context);
// TODO Auto-generated constructor stub
}

@Override
public void hide() {
// Do Nothing to keep the show the controller all times

}

}


The exception:

02-21 21:03:33.829: E/AndroidRuntime(8889): FATAL EXCEPTION: main
02-21 21:03:33.829: E/AndroidRuntime(8889): java.lang.IllegalStateException
02-21 21:03:33.829: E/AndroidRuntime(8889): at android.media.MediaPlayer.isPlaying(Native Method)
02-21 21:03:33.829: E/AndroidRuntime(8889): at rce.android.naturalocal.NaturaPlayer.isPlaying(NaturaPlayer.java:126)
02-21 21:03:33.829: E/AndroidRuntime(8889): at rce.android.naturalocal.NaturaPlayer.getCurrentPosition(NaturaPlayer.java:115)
02-21 21:03:33.829: E/AndroidRuntime(8889): at android.widget.MediaController.setProgress(MediaController.java:436)
02-21 21:03:33.829: E/AndroidRuntime(8889): at android.widget.MediaController.access$500(MediaController.java:74)
02-21 21:03:33.829: E/AndroidRuntime(8889): at android.widget.MediaController$3.handleMessage(MediaController.java:407)
02-21 21:03:33.829: E/AndroidRuntime(8889): at android.os.Handler.dispatchMessage(Handler.java:99)
02-21 21:03:33.829: E/AndroidRuntime(8889): at android.os.Looper.loop(Looper.java:137)
02-21 21:03:33.829: E/AndroidRuntime(8889): at android.app.ActivityThread.main(ActivityThread.java:4441)
02-21 21:03:33.829: E/AndroidRuntime(8889): at java.lang.reflect.Method.invokeNative(Native Method)
02-21 21:03:33.829: E/AndroidRuntime(8889): at java.lang.reflect.Method.invoke(Method.java:511)
02-21 21:03:33.829: E/AndroidRuntime(8889): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-21 21:03:33.829: E/AndroidRuntime(8889): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-21 21:03:33.829: E/AndroidRuntime(8889): at dalvik.system.NativeStart.main(Native Method)

Answer

you will have to check if the mediaPlayer is actually running before calling stop, else you will get IllegalStateException . Also you will get that when doing anything to a released MediaPlayer object. your code should be:

    onClick(View view) {

      if(mediaPlayer != null) {
        if mediaPlayer.isPlaying())
            {
                mediaPlayer.stop();
            }
            mediaPlayer.release();
            mediaPlayer = null;
        }
    }





    onStop() {
        super.onStop();
        if(mediaPlayer != null) {
            if mediaPlayer.isPlaying())
            {
                mediaPlayer.stop();
            }
            mediaPlayer.release();
            mediaPlayer = null;
        }

    }

Please take a look also at MediaPlayer Documentations : Doc

Comments