title: Android MediaPlayer Error (-38, 0) "stop called in state 0"
body: <p>I have looked at various different websites looking for a solution for this problem in my code. It is a basic audio player with 3 buttons: play, pause and stop. Play and pause work ok and so does stop but once the audio has been stopped it refuses to start again, throwing an error:</p>
  
  <pre><code>E/MediaPlayer: stop called in state 0
  E/MediaPlayer: error (-38, 0)
  E/MediaPlayer: Error (-38,0)
  </code></pre>
  
  <p>This is my MainActivity.java:</p>
  
  <pre><code>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);
      }
  }
  }
  </code></pre>
  
  <p>And activity_main.xml:</p>
  
  <pre><code>&lt;TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  android:paddingBottom="@dimen/activity_vertical_margin"
  tools:context=".MainActivity"&gt;
  
  &lt;TableRow
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"&gt;
  
      &lt;Button
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Play"
              android:id="@+id/playButton"
              android:layout_gravity="center_horizontal|top"
              android:longClickable="false"
              android:layout_weight="1"
              android:layout_column="8"
              android:enabled="false"/&gt;
  &lt;/TableRow&gt;
  
  &lt;TableRow
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"&gt;
  
      &lt;Button
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Pause"
              android:id="@+id/pauseButton"
              android:layout_gravity="center_horizontal|top"
              android:layout_weight="1"
              android:layout_column="8"
              android:layout_span="7"/&gt;
  &lt;/TableRow&gt;
  
  &lt;TableRow
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"&gt;
  
      &lt;Button
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Stop"
              android:id="@+id/stopButton"
              android:layout_column="8"
              android:layout_span="24"
              android:layout_weight="1"/&gt;
  &lt;/TableRow&gt;
  
  &lt;TableRow
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"&gt;
  &lt;/TableRow&gt;
  
  &lt;TableRow
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"&gt;
  
      &lt;SeekBar
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:id="@+id/seekBar"
              android:layout_column="8"
              android:layout_span="24"
              android:layout_weight="1"/&gt;
  &lt;/TableRow&gt;
  </code></pre>
  
  <p></p>
  
  <p>If anyone could help me resolve this error, it would be much appreciated. I have already searched round for solutions and tried multiple, but none seemed to work properly.</p>
  
  <p>EDIT: I changed a little bit of the code:</p>
  
  <p>My question is still about the error, and this is now my edited code:</p>
  
  <pre><code>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);
      }
  }
  }
  </code></pre>
  
  <p>I have tried getting the basics working without a seekbar too, just to make sure that isn't causing an error but it lies somewhere within the logic of the play/pause/stop code because it was producing the same error even with the seekbar code omitted.</p>