Ошибка Android MediaPlayer (-38, 0) «останов вызова в состоянии 0»

Я просматривал различные веб-сайты в поисках решения этой проблемы в своем коде. Это базовый аудиоплеер с 3 кнопками: воспроизведение, пауза и остановка. Воспроизведение и пауза работают нормально, и поэтому останавливается, но как только звук останавливается, он отказывается запускаться снова, выдавая ошибку:

E/MediaPlayer: stop called in state 0
E/MediaPlayer: error (-38, 0)
E/MediaPlayer: Error (-38,0)

Это мой MainActivity.java:

import android.app.Activity;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;

import java.io.IOException;

public class MainActivity extends Activity implements MediaPlayer.OnPreparedListener {

    static Button playButton;
    static Button pauseButton;
    static Button stopButton;
    static SeekBar seekBar;
    private static MediaPlayer player;
static Handler handler;
static Uri audio;

@Override
protected void onCreate(Bundle savedInstanceState) {
    player = MediaPlayer.create(this, R.raw.airbourne_runnin_wild);
    Uri audio = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.airbourne_runnin_wild);
    try {
        player.setDataSource(getAssets().openFd("raw/airbourne_runnin_wild.mp3").getFileDescriptor());
    } catch (IOException e) {
        e.printStackTrace();
    }
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    playButton = (Button) findViewById(R.id.playButton);
    pauseButton = (Button) findViewById(R.id.pauseButton);
    stopButton = (Button) findViewById(R.id.stopButton);
    seekBar = (SeekBar) findViewById(R.id.seekBar);

    player.setOnPreparedListener(this);

    handler = new Handler();

    seekBar.setMax(player.getDuration());

    playButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            if (!player.isPlaying()) {
                try {
                    player.setDataSource(getAssets().openFd("raw/airbourne_runnin_wild.mp3").getFileDescriptor());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                player.start();
                updateSeekBar();
            }
        }
    });

    pauseButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            if (player.isPlaying()) {
                player.pause();
            }
        }
    });

    stopButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            if (player.isPlaying()) {
                player.stop();
                seekBar.setProgress(0);
                seekBar.invalidate();
                try {
                    player.setDataSource(getAssets().openFd("raw/airbourne_runnin_wild.mp3").getFileDescriptor());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    });

    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
            if (b) {
                seekChanged(seekBar, i, b);
            }
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });

    player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mediaPlayer) {
            player.stop();
            seekBar.setProgress(0);
            //player.prepareAsync();
            seekBar.invalidate();
        }
    });
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public void onPrepared(MediaPlayer mediaPlayer) {
    playButton.setEnabled(true);
}

public void seekChanged(SeekBar seekBar, int progress, boolean fromUser) {
    player.seekTo(progress);
}

public void updateSeekBar() {
    seekBar.setProgress(player.getCurrentPosition());

    if (player.isPlaying()) {
        Runnable notification = new Runnable() {
            public void run() {
                updateSeekBar();
            }
        };
        handler.postDelayed(notification, 1500);
    }
}
}

И Activity_main.xml:





    




    




    







    

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

РЕДАКТИРОВАТЬ: я немного изменил код:

Мой вопрос по-прежнему об ошибке, и теперь это мой отредактированный код:

import android.app.Activity;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;

import java.io.IOException;

public class MainActivity extends Activity implements MediaPlayer.OnPreparedListener {

static Button playButton;
static Button pauseButton;
static Button stopButton;
static SeekBar seekBar;
private static MediaPlayer player;
static Handler handler;
static Uri audio;
static boolean canMakeCall = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    player = MediaPlayer.create(this, R.raw.airbourne_runnin_wild);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    playButton = (Button) findViewById(R.id.playButton);
    pauseButton = (Button) findViewById(R.id.pauseButton);
    stopButton = (Button) findViewById(R.id.stopButton);
    seekBar = (SeekBar) findViewById(R.id.seekBar);

    if (canMakeCall = true) {
        player.setOnPreparedListener(this);

        handler = new Handler();

        seekBar.setMax(player.getDuration());

        playButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                if (!player.isPlaying()) {
                    player.start();
                    updateSeekBar();
                }
            }
        });

        pauseButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                if (player.isPlaying()) {
                    player.pause();
                }
            }
        });

        stopButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                if (player.isPlaying()) {
                    player.stop();
                    seekBar.setProgress(0);
                    seekBar.invalidate();
                    try {
                        player.prepare();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                if (b) {
                    seekChanged(seekBar, i, b);
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });

        player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                mediaPlayer.stop();
                //player.stop();

                seekBar.setProgress(0);
                //player.prepareAsync();
                seekBar.invalidate();
            }
        });
    }
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public void onPrepared(MediaPlayer mediaPlayer) {
    playButton.setEnabled(true);
    canMakeCall = true;
}

public void seekChanged(SeekBar seekBar, int progress, boolean fromUser) {
    player.seekTo(progress);
}

public void updateSeekBar() {
    seekBar.setProgress(player.getCurrentPosition());

    if (player.isPlaying()) {
        Runnable notification = new Runnable() {
            public void run() {
                updateSeekBar();
            }
        };
        handler.postDelayed(notification, 1500);
    }
}
}

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

Ответы на вопрос(3)

Ваш ответ на вопрос