Search code examples
androidmedia-playerandroid-mediaplayerrelease

Android - MediaPlayer.release on Detroy not working


I have searched for many answers on Stack-overflow but none works for me, must use was this which I use but is not working too...

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

Declared as : MediaPlayer mediaPlayer=new MediaPlayer();

Preparing Media-player Method is this :

public void playMp3(String _link){
        setVolumeControlStream(AudioManager.STREAM_MUSIC);
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

    try {
        mediaPlayer.setDataSource(_link);
        mediaPlayer.prepareAsync();
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                btnDegjo.setVisibility(View.VISIBLE);
            }
        });
    } catch (IOException e) {
        e.printStackTrace();
    }
}

And when user clicks the button mp3 is playing or pause or stop.. My needs : When users click back button or onDestroy mediaPlayer to be released, so method playMp3(link); is called onCreate.. and I don't know if users go back immediately or playing music and go back..

@Override
    public void onBackPressed() {
    super.onBackPressed();
    releaseMediaPlayer();
}

@Override
    protected void onDestroy() {
    super.onDestroy();  
    releaseMediaPlayer();
}

With this code when users hit back button or onDestroy application is stopped working.. Why ?

EDIT:

10-13 15:45:09.886: E/AndroidRuntime(10589): FATAL EXCEPTION: main 10-13 15:45:09.886: E/AndroidRuntime(10589): Process: com.FS.myapp, PID: 10589 10-13 15:45:09.886: E/AndroidRuntime(10589): java.lang.RuntimeException: Unable to pause activity {com.FS.myapp/com.FS.myapp.SS}: java.lang.NullPointerException 10-13 15:45:09.886: E/AndroidRuntime(10589): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3242) 10-13 15:45:09.886: E/AndroidRuntime(10589): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3193) 10-13 15:45:09.886: E/AndroidRuntime(10589): at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3171) 10-13 15:45:09.886: E/AndroidRuntime(10589): at android.app.ActivityThread.access$1000(ActivityThread.java:151) 10-13 15:45:09.886: E/AndroidRuntime(10589): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1338) 10-13 15:45:09.886: E/AndroidRuntime(10589): at android.os.Handler.dispatchMessage(Handler.java:110) 10-13 15:45:09.886: E/AndroidRuntime(10589): at android.os.Looper.loop(Looper.java:193) 10-13 15:45:09.886: E/AndroidRuntime(10589): at android.app.ActivityThread.main(ActivityThread.java:5292) 10-13 15:45:09.886: E/AndroidRuntime(10589): at java.lang.reflect.Method.invokeNative(Native Method) 10-13 15:45:09.886: E/AndroidRuntime(10589): at java.lang.reflect.Method.invoke(Method.java:515) 10-13 15:45:09.886: E/AndroidRuntime(10589): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824) 10-13 15:45:09.886: E/AndroidRuntime(10589): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640) 10-13 15:45:09.886: E/AndroidRuntime(10589): at dalvik.system.NativeStart.main(Native Method) 10-13 15:45:09.886: E/AndroidRuntime(10589): Caused by: java.lang.NullPointerException 10-13 15:45:09.886: E/AndroidRuntime(10589): at com.FS.myapp.SS.onPause(SS.java:62) 10-13 15:45:09.886: E/AndroidRuntime(10589): at android.app.Activity.performPause(Activity.java:5368) 10-13 15:45:09.886: E/AndroidRuntime(10589): at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1239) 10-13 15:45:09.886: E/AndroidRuntime(10589): at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3224) 10-13 15:45:09.886: E/AndroidRuntime(10589): ... 12 more


Solution

  • Your stacktrace and onPause method indicate that one of your variables is null.

    A quick fix can be:

    @Override 
    protected void onPause() { 
        if (mediaPlayer != null && mediaPlayer.isPlaying()){
            mediaPlayer.pause();
        }
    
        if (btnPlay != null)
            btnPlay.setText("Play"); 
    
        super.onPause();
    }