Tôi gặp phải sự cố của bạn, Skyler.
Bạn là chính xác. Tài liệu cho thấy không có trạng thái không hợp lệ cho mediaPlayer.reset(), nhưng đó không phải là sự thiếu chính xác đầu tiên trong tài liệu.
Điều tôi nhận thấy là danh sách các trạng thái VALID không nói "Bất kỳ"; nó liệt kê mọi trạng thái cụ thể ngoại trừ hai: Chuẩn bị và Kết thúc.
Tôi đã thử nghiệm, nhưng không thể khiến IllegalStateException bị ném trong nỗ lực gọi phát hành() trong khi MediaPlayer hy vọng ở trạng thái Chuẩn bị (sử dụng preparAsync()). Tôi sẽ không đảm bảo nó không xảy ra, nhưng tôi không thể làm cho nó xảy ra. Những gì tôi đã thấy trong trường hợp đó là các thông điệp tường trình sau đây:
04-11 11:41:54.740: E/MediaPlayer(4930): error (1, -2147483648)
04-11 11:41:54.748: E/MediaPlayer(4930): Error (1,-2147483648)
Có, cả hai thông báo lỗi xuất hiện Ngoại lệ được ném.
Tuy nhiên, nếu tôi gọi reset() sau khi phát hành() sau đó tôi nhận được lỗi:
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
Vì vậy, đoán The Ink của Modern là đúng. MediaPlayer.reset() ném IllegalStateException trong trạng thái End (xảy ra sau khi release() được gọi).
Trong trường hợp của mình, tôi phát hiện ra mình đang gọi release() on onause(), nhưng không làm gì để khởi tạo lại MediaPlayer trong onResume(). Do đó, nó đã ở trạng thái End khi tôi gọi reset();
mỗi http://developer.android.com/reference/android/media/MediaPlayer.html,
Once the MediaPlayer object is in the End state, it can no longer be used and there is no way to bring it back to any other state.
Điều đó có nghĩa bạn cần để tạo ra các MediaPlayer khắp nơi trên một lần nữa, bắt đầu với MediaPlayer = MediaPlayer mới() hoặc một trong các phương pháp mediaPlayer.onCreate(). Hoặc hãy cẩn thận khi bạn gọi phát hành().
Hm, nó trông giống như tôi đã nhầm lẫn giữa 'MediaPlayer' với chủ đề khác. Xin lỗi về sự nhầm lẫn. :) – Wroclai