I am currently trying to design a simple app that streams an internet radio station. I have the URL for the station and am setting up the Media Player like
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 isn't crashing when emulated, but nothing is playing and I am get the following error:
start called in state 0
and right below it is
Error (-38,0)
Does anyone know what this means?
I've read a little about these state errors, but couldn't find anything that applies to my project.
I encountered the same issue few days ago. My audio MediaPlayer works fine on devices with high processing power, but for slow devices, the media player just did not play some time and from LogCat it had many complain about called in wrong state. So I resolved it by calling putting the call to start(), pause(),... in onPrepared() method of OnPreparedListener() as below:
Also try to release any media player that you do not need any more. For example, if you do not want to play the audio or video on background then you should call mediaPlayer.release() in onPause().
You need to call
mediaPlayer.start()
in theonPrepared
method by using a listener. You are getting this error because you are callingmediaPlayer.start()
before it has reached the prepared state.Here is how you can do it :
I solved both the errors (-19,0) and (-38,0) , by creating a new object of MediaPlayer every time before playing and releasing it after that.
Before :
}
After:
}
You get this message in the logs, because you do something that is not allowed in the current state of your MediaPlayer instance.
Therefore you should always register an error handler to catch those things (as @tidbeck suggested).
At first, I advice you to take a look at the documentation for the
MediaPlayer
class and get an understanding of what that with states means. See: http://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagramYour mistake here could well be one of the common ones, the others wrote here, but in general, I would take a look at the documentation of what methods are valid to call in what state: http://developer.android.com/reference/android/media/MediaPlayer.html#Valid_and_Invalid_States
In my example it was the method
mediaPlayer.CurrentPosition
, that I called while the media player was in a state, where it was not allowed to call this property.Some times file are encoded in a way that Android can't decode. Even some mp4 files can not be played. Please try a different file format (.3gp are played most of the time) and see..
It seems like Error -38 means a state-exception (as the error-message indicates). For example if you call
start()
, before the song was ready, or when you callpause()
, even if the song isn't playing at all.To fix this issue check the state of the mediaPlayer before calling the methods. For example:
Additionally, the MediaPlayer is sending event-messages. Even if you do not need the prepared-event (although it would be a good idea to not start the playback before this event was fired) you must set a callback-listener. This also holds true for the
OnErrorListener
,OnCompletionListener
,OnPreparedListener
andOnSeekCompletedListener
(if you call the seek method).Listeners can be attached simply by