Media player called in state 0, error (-38.0)

I'm currently trying to create a simple application that broadcasts an Internet radio station. I have a URL for the station and I'm setting up Media Player, for example

MediaPlayer mediaPlayer = new MediaPlayer(); try { mediaPlayer.setDataSource(URL); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { mediaPlayer.prepare(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } mediaPlayer.start(); 

The program does not crash when emulating, but nothing reproduces, and I get the following error:

 start called in state 0 

and right below it

 Error (-38,0) 

Does anyone know what that means?

I read a little about these status errors, but could not find anything that applied to my project.

+87
android android-mediaplayer
Jan 25 2018-12-12T00:
source share
15 answers

You need to call mediaPlayer.start() in the onPrepared method using a listener. You get this error because you call mediaPlayer.start() until you reach the prepared state.

Here's how you can do it:

 mp.setDataSource(url); mp.setOnPreparedListener(this); mp.prepareAsync(); public void onPrepared(MediaPlayer player) { player.start(); } 
+98
Jul 18 2018-12-18T00:
source share

It seems that a -38 error means a condition exception (as indicated by the error message). For example, if you call start() before the song is ready, or when you call pause() , even if the song does not play at all.

To resolve this issue, check the status of mediaPlayer before calling the methods. For example:

 if(mediaPlayer.isPlaying()) { mediaPlayer.pause(); } 

In addition, MediaPlayer sends event messages. Even if you do not need a prepared event (although it would be nice not to start playing before this event has been triggered), you should set up a listener callback. This is also true for OnErrorListener , OnCompletionListener , OnPreparedListener and OnSeekCompletedListener (if you call the search method).

Listeners can be attached simply

 mediaPlayer.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { // Do something. For example: playButton.setEnabled(true); } }); 
+26
Jan 14 '13 at 15:42
source share

I had this error when I tried to get the current position (MediaPlayer.getCurrentPosition ()) of the media player when it was not in the prepared statement. I went around this by tracking its state and calling the getCurrentPosition () method after calling onPreparedListener.

+8
May 18, '15 at 7:00 a.m.
source share

This is my code, tested and workable:

 package com.example.com.mak.mediaplayer; import android.media.MediaPlayer; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.app.Activity; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final MediaPlayer mpp = MediaPlayer.create(this, R.raw.red); //mp3 file in res/raw folder Button btnplay = (Button) findViewById(R.id.btnplay); //Play btnplay.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View vone) { mpp.start(); } }); Button btnpause = (Button) findViewById(R.id.btnpause); //Pause btnpause.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View vtwo) { if (mpp.isPlaying()) { mpp.pause(); mpp.seekTo(0); } } }); } } 
+6
Mar 22 '13 at 23:38
source share

Several times the file is encoded so that Android cannot decode. Even some mp4 files cannot be played. Please try a different file format (.3gp play most of the time) and see ..

+2
Mar 15 '12 at 7:55
source share

i checked below code. works fine

 public class test extends Activity implements OnErrorListener, OnPreparedListener { private MediaPlayer player; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); player = new MediaPlayer(); player.setAudioStreamType(AudioManager.STREAM_MUSIC); try { player.setDataSource("http://www.hubharp.com/web_sound/BachGavotte.mp3"); player.setOnErrorListener(this); player.setOnPreparedListener(this); player.prepareAsync(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @Override public void onDestroy() { super.onDestroy(); player.release(); player = null; } @Override public void onPrepared(MediaPlayer play) { play.start(); } @Override public boolean onError(MediaPlayer arg0, int arg1, int arg2) { return false; } } 
+2
Feb 14 '13 at 7:10
source share

I ran into the same problem a few days ago. My MediaPlayer audio works fine on devices with high processing power, but for slow devices the media player just did not play for a while, and from LogCat he complained a lot about what was caused in the wrong state. Therefore, I resolved it by calling start () , pause () , ... in the onPrepared () method of OnPreparedListener () , as shown below:

 mediaPlayer.prepare(); mediaPlayer.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { ........ mediaPlayer.start(); .... songControlBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mediaPlayer.isPlaying()) { mediaPlayer.pause(); } else { mediaPlayer.start(); } } }); mediaPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { ............ } }); } }); 

Also try freeing up any media player that you no longer need. For example, if you do not want to play audio or video in the background, you should call mediaPlayer.release () in onPause () .

+2
01 Oct '14 at 9:27
source share

I solved both (-19.0) and (-38.0) errors by creating a new MediaPlayer object each time before playing and releasing it after that.

Before:

 void play(int resourceID) { if (getActivity() != null) { //Using the same object - Problem persists player = MediaPlayer.create(getActivity(), resourceID); player.setAudioStreamType(AudioManager.STREAM_MUSIC); player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { player.release(); } }); player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mp.start(); } }); } 

}

After:

 void play(int resourceID) { if (getActivity() != null) { //Problem Solved //Creating new MediaPlayer object every time and releasing it after completion final MediaPlayer player = MediaPlayer.create(getActivity(), resourceID); player.setAudioStreamType(AudioManager.STREAM_MUSIC); player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { player.release(); } }); player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mp.start(); } }); } 

}

+1
May 31 '16 at 8:48
source share

You get this message in the logs because you are doing something that is not allowed in the current state of your MediaPlayer instance.

Therefore, you should always register an error handler to catch these things (as @tidbeck suggested).

First, I advise you to take a look at the documentation for the MediaPlayer class and understand what this means with states. See: http://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagram

Your error here may be one of the common ones, others wrote here, but in general I would look at the documentation about which methods are valid for calling in which state: http://developer.android.com/reference/android/media/MediaPlayer. html # Valid_and_Invalid_States

In my example, it was the mediaPlayer.CurrentPosition method, which I called when the media player was in a state where it was not allowed to call this property.

0
Jan 09 '15 at 10:03
source share

I also got this error, which I tried with onPreparedListener, but still got this error. Finally, I got the decision that the error is my mistake because I forgot the permission to access the Internet in Android Manifest xml. :)

 <uses-permission android:name="android.permission.INTERNET" /> 

I used a coding sample for a media planner. I used in StreamService.java
onCreate method

  String url = "http://s17.myradiostream.com:11474/"; mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource(url); mediaPlayer.prepare(); 
0
Jan 25 '16 at 5:06
source share
  if(length>0) { mediaPlayer = new MediaPlayer(); Log.d("length",""+length); try { mediaPlayer.setDataSource(getApplication(),Uri.parse(uri)); } catch(IOException e) { e.printStackTrace(); } mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { mediaPlayer.seekTo(length); mediaPlayer.start(); } }); mediaPlayer.prepareAsync(); 
0
Oct 18 '16 at 11:27
source share

It was very frustrating. So, I have a solution that works for me.

 try { if (mediaPlayer != null) { mediaPlayer.release(); mediaPlayer = null; } mediaPlayer = new MediaPlayer(); mediaPlayer.setDataSource(file.getAbsolutePath()); mediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION); mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { mediaPlayer.start(); mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mediaPlayer) { mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; } }); } }); mediaPlayer.prepare(); } catch (Exception e) { e.printStackTrace(); } 
0
Nov 10 '17 at 21:48
source share

It worked for me

 mp.seekTo(0); mp.start(); 
0
Feb 03 '18 at 19:37
source share

I met the same problem as before, the friend on the first floor was right, you called start() at the wrong time, you must set the listener to prepare () or prepareSync() using this method mediaPlayer.setOnPreparedListener(this) ; before preparing, in this callback start() . He can solve your problem. I have already tried.

-one
Jun 24 '14 at 6:40
source share
 mp = new MediaPlayer(); AssetFileDescriptor afd = mContext.getAssets().openFd(fileName); mp.reset(); mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); mp.prepare(); mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { public void onPrepared(MediaPlayer mp) { mp.start(); } }); mp.prepareAsync(); 
-one
Apr 08 '15 at 9:36
source share



All Articles