Ошибка MediaPlayer.getCurrentPosition() при закрытии приложения

234
27 февраля 2018, 05:13

Использую MediaPlayer. Все хорошо работает, но есть одно но: при закрытии приложении (нажатии кнопки "назад") - приложение закрывается, но выдает ошибку. В логе написана причина, но я не понимаю как ее обойти

Log

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.media.MediaPlayer.getCurrentPosition()' on a null object reference
                                                                                   at com.example.gukov.sweetplayer.MainActivity$7.run(MainActivity.java:251)
                                                                                   at android.os.Handler.handleCallback(Handler.java:836)
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:103)
                                                                                   at android.os.Looper.loop(Looper.java:203)
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:6361)
                                                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)

MainActivity

package com.example.gukov.sweetplayer;
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;
import java.util.concurrent.TimeUnit;
public class MainActivity extends Activity implements MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener {
    ImageView ivCover;
    TextView tvNumber, tvName, tvNow, tvFull;
    ImageButton btnLast, btnNext, btnPlay, btnPause;
    Switch switchRepeat;
    SeekBar seekbar;
    MediaPlayer mPlayer;
    AudioManager aManager;
    Handler myHandler = new Handler();
    double nowTime = 0;
    double fullTime = 0;
    int currentIndex = 0;
    int sounds[] = {R.raw.song_1, R.raw.song_2, R.raw.song_3, R.raw.song_4, R.raw.song_5, R.raw.song_6, R.raw.song_7, R.raw.song_8, R.raw.song_9};
    int covers[] = {R.drawable.song_1, R.drawable.song_2, R.drawable.song_3, R.drawable.song_4, R.drawable.song_5, R.drawable.song_6, R.drawable.song_7, R.drawable.song_8, R.drawable.song_9};
//    String sounds[] = {"http://d.zaix.ru/5Y4X.mp3", "http://d.zaix.ru/5Y8M.mp3", "http://d.zaix.ru/5Yy3.mp3", "http://d.zaix.ru/5Yy9.mp3"};
    int soundsName[] = {R.string.soundName_1, R.string.soundName_2, R.string.soundName_3, R.string.soundName_4, R.string.soundName_5, R.string.soundName_6, R.string.soundName_7, R.string.soundName_8, R.string.soundName_9};
    int soundsNumber[] = {R.string.soundNumber_1, R.string.soundNumber_2, R.string.soundNumber_3, R.string.soundNumber_4, R.string.soundNumber_5, R.string.soundNumber_6, R.string.soundNumber_7, R.string.soundNumber_8, R.string.soundNumber_9};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        setContentView(R.layout.activity_main);
        ivCover = (ImageView) findViewById(R.id.ivCover);
        btnLast = (ImageButton) findViewById(R.id.btnLast);
        btnNext = (ImageButton) findViewById(R.id.btnNext);
        btnPlay = (ImageButton) findViewById(R.id.btnPlay);
        btnPause = (ImageButton) findViewById(R.id.btnPause);
        tvNumber = (TextView) findViewById(R.id.tvNumber);
        tvName = (TextView) findViewById(R.id.tvName);
        tvNow = (TextView) findViewById(R.id.tvNow);
        tvFull = (TextView) findViewById(R.id.tvFull);
        seekbar = (SeekBar) findViewById(R.id.seekBar);
        switchRepeat = (Switch) findViewById(R.id.switchRepeat);
        aManager = (AudioManager) getSystemService(AUDIO_SERVICE);
        DisplayMetrics displaymetrics = getResources().getDisplayMetrics();
        RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) ivCover.getLayoutParams(); // получаем параметры
        params.height = displaymetrics.widthPixels; // высота равна ширине экрана
        ivCover.setLayoutParams(params);
        switchRepeat.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (mPlayer != null)
                    mPlayer.setLooping(isChecked);
                if (isChecked == true)
                    Toast.makeText(getApplicationContext(), "Повтор трека включен", Toast.LENGTH_SHORT).show();
                else
                    Toast.makeText(getApplicationContext(), "Повтор трека выключен", Toast.LENGTH_SHORT).show();
            }
        });
        releaseMP();

//        mPlayer = new MediaPlayer();
//        mPlayer.setDataSource(sounds[currentIndex]);
//        mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
//        mPlayer.setOnPreparedListener(this);
//        mPlayer.prepareAsync();
        mPlayer = MediaPlayer.create(this, sounds[currentIndex]);
        fullTime = mPlayer.getDuration();
        nowTime = mPlayer.getCurrentPosition();
        seekbar.setProgress(0);
        seekbar.setMax((int) fullTime);
        seekbar.setClickable(false);

        btnPlay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!mPlayer.isPlaying())
                    mPlayer.start();
                Toast.makeText(getApplicationContext(), "Воспроизведение начато", Toast.LENGTH_SHORT).show();
                ivCover.setImageResource(covers[currentIndex]);
                tvNumber.setText(soundsNumber[currentIndex]);
                tvName.setText(soundsName[currentIndex]);
                tvNow.setText(String.format("%d мин %d сек",
                        TimeUnit.MILLISECONDS.toMinutes((long) nowTime),
                        TimeUnit.MILLISECONDS.toSeconds((long) nowTime) -
                                TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) nowTime)))
                );
                tvFull.setText(String.format("%d мин %d сек",
                        TimeUnit.MILLISECONDS.toMinutes((long) fullTime),
                        TimeUnit.MILLISECONDS.toSeconds((long) fullTime) -
                                TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) fullTime)))
                );
                seekbar.setProgress((int)nowTime);
                myHandler.postDelayed(UpdateSongTime,100);
            }
        });

        btnPause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mPlayer.isPlaying())
                    mPlayer.pause();
                Toast.makeText(getApplicationContext(), "Воспроизведение приостановлено", Toast.LENGTH_SHORT).show();
            }
        });


        btnLast.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (currentIndex > 0) {
                    currentIndex--;
                } else currentIndex = sounds.length - 1;
                ivCover.setImageResource(covers[currentIndex]);
                tvNumber.setText(soundsNumber[currentIndex]);
                tvName.setText(soundsName[currentIndex]);
                if (mPlayer.isPlaying()) {
                    mPlayer.stop();
                    mPlayer.release();
                    mPlayer = null;
                }
                mPlayer = MediaPlayer.create(getApplicationContext(), sounds[currentIndex]);
                mPlayer.start();
                fullTime = mPlayer.getDuration();
                nowTime = mPlayer.getCurrentPosition();
                seekbar.setProgress(0);
                seekbar.setMax((int) fullTime);
                tvNow.setText(String.format("%d мин %d сек",
                        TimeUnit.MILLISECONDS.toMinutes((long) nowTime),
                        TimeUnit.MILLISECONDS.toSeconds((long) nowTime) -
                                TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) nowTime)))
                );
                tvFull.setText(String.format("%d мин %d сек",
                        TimeUnit.MILLISECONDS.toMinutes((long) fullTime),
                        TimeUnit.MILLISECONDS.toSeconds((long) fullTime) -
                                TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) fullTime)))
                );
            }
        });

        btnNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (currentIndex < sounds.length - 1) {
                    currentIndex++;
                } else {currentIndex = 0; Toast.makeText(getApplicationContext(), "Начало плейлиста", Toast.LENGTH_SHORT).show();}
                ivCover.setImageResource(covers[currentIndex]);
                tvNumber.setText(soundsNumber[currentIndex]);
                tvName.setText(soundsName[currentIndex]);
                if (mPlayer.isPlaying()) {
                    mPlayer.stop();
                    mPlayer.release();
                    mPlayer = null;
                }
                mPlayer = MediaPlayer.create(getApplicationContext(), sounds[currentIndex]);
                mPlayer.start();
                fullTime = mPlayer.getDuration();
                nowTime = mPlayer.getCurrentPosition();
                seekbar.setProgress(0);
                seekbar.setMax((int) fullTime);
                tvNow.setText(String.format("%d мин %d сек",
                        TimeUnit.MILLISECONDS.toMinutes((long) nowTime),
                        TimeUnit.MILLISECONDS.toSeconds((long) nowTime) -
                                TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) nowTime)))
                );
                tvFull.setText(String.format("%d мин %d сек",
                        TimeUnit.MILLISECONDS.toMinutes((long) fullTime),
                        TimeUnit.MILLISECONDS.toSeconds((long) fullTime) -
                                TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) fullTime)))
                );
            }
        });

        seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
            }
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if(mPlayer != null && fromUser){
                    mPlayer.seekTo(progress);
                }
            }
        });
    }

    private Runnable UpdateSongTime = new Runnable() {
        public void run() {
            nowTime = mPlayer.getCurrentPosition();
            tvNow.setText(String.format("%d мин %d сек",
                    TimeUnit.MILLISECONDS.toMinutes((long) nowTime),
                    TimeUnit.MILLISECONDS.toSeconds((long) nowTime) -
                            TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) nowTime)))
            );
            if (mPlayer.isPlaying()) {
                btnPause.setVisibility(View.VISIBLE);
                btnPlay.setVisibility(View.GONE);
            } else {
                btnPause.setVisibility(View.GONE);
                btnPlay.setVisibility(View.VISIBLE);
            }
            seekbar.setProgress((int)nowTime);
            myHandler.postDelayed(this, 100);
        }
    };

    private void releaseMP() {
        if (mPlayer != null) {
            try {
                mPlayer.release();
                mPlayer = null;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.start();
    }
    @Override
    public void onCompletion(MediaPlayer mp) {
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        releaseMP();
    }
}
Answer 1

Сделал. Добавил проверку на (mPlayer != null)

private Runnable UpdateSongTime = new Runnable() {
        public void run() {
            if (mPlayer != null) {
                nowTime = mPlayer.getCurrentPosition();
                tvNow.setText(String.format("%d мин %d сек",
                        TimeUnit.MILLISECONDS.toMinutes((long) nowTime),
                        TimeUnit.MILLISECONDS.toSeconds((long) nowTime) -
                                TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) nowTime)))
                );
                if (mPlayer.isPlaying()) {
                    btnPause.setVisibility(View.VISIBLE);
                    btnPlay.setVisibility(View.GONE);
                } else {
                    btnPause.setVisibility(View.GONE);
                    btnPlay.setVisibility(View.VISIBLE);
                }
                seekbar.setProgress((int)nowTime);
                myHandler.postDelayed(this, 100);
            }
        }
    };
READ ALSO
WebDriver, всплывающая подсказка

WebDriver, всплывающая подсказка

При вводе в поле e-mail чего-то вроде "абв" - появляется всплывающая подсказка, которая исчезает при клике по нейКак можно ее отловить? В ресурсах...

195
Как получить локальный ip адрес машины в Java EE

Как получить локальный ip адрес машины в Java EE

Как получить локальный адрес машины в вебсервере Java EE? Внешний я могу получить, а вот именно локальныйТобишь человек подключается на сайт...

231
Проблема с автозаполнением в инпуте

Проблема с автозаполнением в инпуте

Здравствуйте друзьяИмеется инпут

264
Помогите, не срабатывает рекурсия

Помогите, не срабатывает рекурсия

ПриветПишу мини игру "карточный жребий"

247