Медиаплеер вылетает из приложения на BackPressed

Кто-нибудь может сказать мне, почему кнопка "Назад" вылетает из приложения? Не имеет значения, что я изменяю в коде, будь то попытка / отлов, onDestroy, onBackPressed, он каждый раз вылетает, но только если я запустил медиаплеер один раз. Если я не запустил его с экрана, кнопка "Назад" не приводит к сбою приложения. Что я делаю неправильно? Спасибо

public class Lesson1Grammar extends Activity implements SeekBar.OnSeekBarChangeListener{

private SeekBar seekBar;
private TextView songCurrentDurationLabel;
private TextView songTotalDurationLabel;
MediaPlayer wholeTextPlayer;
private Utilities utils;
final Handler handler = new Handler();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.lesson1grammar);

    final RelativeLayout playerScreen = (RelativeLayout) findViewById(R.id.playerScreen);
    seekBar = (SeekBar) findViewById(R.id.seekBar);
    seekBar.setOnSeekBarChangeListener(this);
    songCurrentDurationLabel = (TextView) findViewById(R.id.songCurrentDurationLabel);
    songTotalDurationLabel = (TextView) findViewById(R.id.songTotalDurationLabel);
    utils = new Utilities();

    final ImageButton btn_player_screen = (ImageButton) findViewById(R.id.btn_player_screen);
    btn_player_screen.setOnClickListener(new View.OnClickListener() {
        //this hides/unhides the part of the layout in which the player is
        @Override
        public void onClick(View arg0) {
            if (playerScreen.isShown()) {
                playerScreen.setVisibility(View.GONE);
            } else {
                playerScreen.setVisibility(View.VISIBLE);
            }
        }
    });

    final Button btn_default_acc_whole = (Button) findViewById(R.id.btn_default_acc_whole);
    btn_default_acc_whole.setOnClickListener(new View.OnClickListener() {
        public void onClick(View arg0) {//problem here is
            if (playerState == PlayerState_ScAcc) {
                stopSentencePlayer();
                setEngAu(R.raw.default_acc_audio);
                wholeTextPlayer.start();
                setPlayerState(PlayerState_DefAcc);
            }else if (playerState == PlayerState_Sc_Paused){
                stopSentencePlayer();
                setEngAu(R.raw.default_acc_audio);
                wholeTextPlayer.start();
                setPlayerState(PlayerState_DefAcc);
            }else if (playerState == PlayerState_DefAcc) {
                wholeTextPlayer.pause();
                setPlayerState(PlayerState_Def_Paused);
            } else if (playerState == PlayerState_Def_Paused) {
                wholeTextPlayer.start();
                setPlayerState(PlayerState_DefAcc);
            } else {
                setEngAu(R.raw.default_acc_audio);
                wholeTextPlayer.start();
                setPlayerState(PlayerState_DefAcc);
            }
        }
    });

    final Button btn_scottish_acc_whole = (Button) findViewById(R.id.btn_scottish_acc_whole);
    btn_scottish_acc_whole.setOnClickListener(new View.OnClickListener() {
        public void onClick(View arg0) {//problem here is
            if (playerState == PlayerState_DefAcc) {
                stopSentencePlayer();
                setEngAu(R.raw.scottish_acc_audio);
                wholeTextPlayer.start();
                setPlayerState(PlayerState_ScAcc);
            }else if (playerState == PlayerState_Def_Paused){
                stopSentencePlayer();
                setEngAu(R.raw.scottish_acc_audio);
                wholeTextPlayer.start();
                setPlayerState(PlayerState_ScAcc);
            }else
            if (playerState == PlayerState_ScAcc) {
                wholeTextPlayer.pause();
                setPlayerState(PlayerState_Sc_Paused);
            } else if (playerState == PlayerState_Sc_Paused) {
                wholeTextPlayer.start();
                setPlayerState(PlayerState_ScAcc);
            } else {
                setEngAu(R.raw.scottish_acc_audio);
                wholeTextPlayer.start();
                setPlayerState(PlayerState_ScAcc);
            }
        }
    });
}

private final int PlayerState_Def_Paused = 1;
private final int PlayerState_Sc_Paused = 2;
private final int PlayerState_DefAcc = 3;
private final int PlayerState_ScAcc = 4;

private int playerState;

private void setPlayerState(int state) {
    playerState = state;
}

public void setEngAu(int engAu) {
    wholeTextPlayer = MediaPlayer.create(this, engAu);
    seekBar.setProgress(0);
    seekBar.setMax(100);
    updateSeekBar();
}

public void updateSeekBar() {
    handler.postDelayed(mUpdateTimeTask, 100);
}

private Runnable mUpdateTimeTask = new Runnable() {
    public void run() {
        long totalDuration = wholeTextPlayer.getDuration();
        long currentDuration = wholeTextPlayer.getCurrentPosition();
        songTotalDurationLabel.setText(""+utils.milliSecondsToTimer(totalDuration));
        songCurrentDurationLabel.setText(""+utils.milliSecondsToTimer(currentDuration));
        int progress = (int)(utils.getProgressPercentage(currentDuration, totalDuration));
        seekBar.setProgress(progress);
        handler.postDelayed(this, 100);
    }
};

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
}

public void onStartTrackingTouch(SeekBar seekBar) {
    handler.removeCallbacks(mUpdateTimeTask);
}

public void onStopTrackingTouch(SeekBar seekBar) {
    handler.removeCallbacks(mUpdateTimeTask);
    int totalDuration = wholeTextPlayer.getDuration();
    int currentPosition = utils.progressToTimer(seekBar.getProgress(), totalDuration);
    wholeTextPlayer.seekTo(currentPosition);
    updateSeekBar();
}

private void stopSentencePlayer() {
    if(wholeTextPlayer !=null){
        try{
            wholeTextPlayer.release();
        }catch(Exception e){

            e.printStackTrace();
        }
    }
}

@Override
public void onBackPressed(){
    if(wholeTextPlayer != null){

            wholeTextPlayer.release();

        }
    finish();
    super.onBackPressed();
}

}

Другим вариантом может быть возврат к тому же состоянию экрана, на котором запущен медиаплеер, и в этом случае звук может быть приостановлен и т. Д., Но, похоже, он превышает мои возможности:(Плеер может воспроизводить в фоновом режиме, это нормально.

Я надеюсь, что я захватил правильную часть. Я только новичок:)

1-06 17:27:02.909    6596-6596/com.tanuljangolulmenetkozben.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.IllegalStateException
        at android.media.MediaPlayer.getDuration(Native Method)
        at com.tanuljangolulmenetkozben.app.Lesson1Grammar$4.run(Lesson1Grammar.java:128)
        at android.os.Handler.handleCallback(Handler.java:587)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:130)
        at android.app.ActivityThread.main(ActivityThread.java:3705)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:507)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
        at dalvik.system.NativeStart.main(Native Method)
11-06 17:27:06.022    1675-1835/? E/Omap4ALSA﹕ called drain&close'

2 ответа

Решение

Как я уже говорил, Handler продолжает работать в то время как ваш Activity разрушает, когда пользователь нажимает onBackPressed(), Поэтому вы должны проверить, работает ли этот обработчик, и остановить его, как вы уже сделали в onStopTrackingTouch() метод:

public void onStopTrackingTouch(SeekBar seekBar) {
    handler.removeCallbacks(mUpdateTimeTask);
    ...
}

Так, onBackPressed должно выглядеть так:

@Override
public void onBackPressed() {
    if (wholeTextPlayer != null) {
        wholeTextPlayer.release();

        if (handler != null)
            handler.removeCallbacks(null);
    }
    finish();
    super.onBackPressed();
}

Еще одно хорошее поведение должно остановить его в onPause или же onStop:

@Override
protected void onStop() {
    super.onStop();
    if (handler != null)
        handler.removeCallbacks(null);
}
private Runnable mUpdateTimeTask = new Runnable() {
    public void run() {
      if(wholeTextPlayer != null){
      }
 }
};

Добавьте условие и проверьте

Другие вопросы по тегам