I ran into your problem, Skyler.
You're right. There are no invalid states in the documentation for mediaPlayer.reset (), but this is not the first inaccuracy in the documentation.
I noticed that the VALID state list does not say "Any"; he lists each specific state, except for two: "Preparation and completion."
I experimented, but could not get an IllegalStateException to be thrown in my attempts to call release (), while MediaPlayer was hoping in a prepared state (using prepareAsync ()). I will not guarantee that this will not happen, but I could not do it. In this case, I saw the following log messages:
04-11 11:41:54.740: E/MediaPlayer(4930): error (1, -2147483648) 04-11 11:41:54.748: E/MediaPlayer(4930): Error (1,-2147483648)
Yes, both error messages appear, one after the other - one with a lowercase โerrorโ and one with an uppercase โErrorโ, but no Exception is thrown.
However, if I call reset () after release (), I get an error:
04-11 11:45:05.232: E/AndroidRuntime(5046): FATAL EXCEPTION: main 04-11 11:45:05.232: E/AndroidRuntime(5046): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.helloandroid/com.android.helloandroid.HelloAndroidActivity}: java.lang.RuntimeException: java.lang.IllegalStateException 04-11 11:45:05.232: E/AndroidRuntime(5046): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1696) 04-11 11:45:05.232: E/AndroidRuntime(5046): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1716) 04-11 11:45:05.232: E/AndroidRuntime(5046): at android.app.ActivityThread.access$1500(ActivityThread.java:124) 04-11 11:45:05.232: E/AndroidRuntime(5046): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:968) 04-11 11:45:05.232: E/AndroidRuntime(5046): at android.os.Handler.dispatchMessage(Handler.java:99) 04-11 11:45:05.232: E/AndroidRuntime(5046): at android.os.Looper.loop(Looper.java:123) 04-11 11:45:05.232: E/AndroidRuntime(5046): at android.app.ActivityThread.main(ActivityThread.java:3806) 04-11 11:45:05.232: E/AndroidRuntime(5046): at java.lang.reflect.Method.invokeNative(Native Method) 04-11 11:45:05.232: E/AndroidRuntime(5046): at java.lang.reflect.Method.invoke(Method.java:507) 04-11 11:45:05.232: E/AndroidRuntime(5046): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 04-11 11:45:05.232: E/AndroidRuntime(5046): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 04-11 11:45:05.232: E/AndroidRuntime(5046): at dalvik.system.NativeStart.main(Native Method) 04-11 11:45:05.232: E/AndroidRuntime(5046): Caused by: java.lang.RuntimeException: java.lang.IllegalStateException 04-11 11:45:05.232: E/AndroidRuntime(5046): at com.android.helloandroid.HelloAndroidActivity.crashMediaPlayer(HelloAndroidActivity.java:423) 04-11 11:45:05.232: E/AndroidRuntime(5046): at com.android.helloandroid.HelloAndroidActivity.onCreate(HelloAndroidActivity.java:87) 04-11 11:45:05.232: E/AndroidRuntime(5046): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 04-11 11:45:05.232: E/AndroidRuntime(5046): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1660) 04-11 11:45:05.232: E/AndroidRuntime(5046): ... 11 more 04-11 11:45:05.232: E/AndroidRuntime(5046): Caused by: java.lang.IllegalStateException 04-11 11:45:05.232: E/AndroidRuntime(5046): at android.media.MediaPlayer._reset(Native Method) 04-11 11:45:05.232: E/AndroidRuntime(5046): at android.media.MediaPlayer.reset(MediaPlayer.java:1112) 04-11 11:45:05.232: E/AndroidRuntime(5046): at com.android.helloandroid.HelloAndroidActivity.crashMediaPlayer(HelloAndroidActivity.java:421) 04-11 11:45:05.232: E/AndroidRuntime(5046): ... 14 more
So self-improvement of Ink Ink was right. MediaPlayer.reset () throws an IllegalStateException in the End state (which occurs after the release () call).
In my case, I found that I was calling release () on onPause (), but did nothing to initialize MediaPlayer again in onResume (). Therefore, it was in End state when I called reset ();
Per http://developer.android.com/reference/android/media/MediaPlayer.html ,
When the MediaPlayer object is in the End state, it can no longer be and there is no way to return it to another state.
This means that you need to create MediaPlayer again, starting with mediaPlayer = new MediaPlayer () or one of the mediaPlayer.onCreate () methods. Or be careful when you call release ().