java.lang.IllegalStateException android.media.MediaPlayer._prepare(Native Method)

错误log:

1566550586.419 28478-28478/com.stone.stonemusic W/System.err: java.lang.IllegalStateException
1566550586.420 28478-28478/com.stone.stonemusic W/System.err: at android.media.MediaPlayer._prepare(Native Method)
1566550586.420 28478-28478/com.stone.stonemusic W/System.err: at android.media.MediaPlayer.prepare(MediaPlayer.java:1236)
1566550586.421 28478-28478/com.stone.stonemusic W/System.err: at com.stone.stonemusic.utils.playControl.MediaUtils.prepare(MediaUtils.java:43)
1566550586.421 28478-28478/com.stone.stonemusic W/System.err: at com.stone.stonemusic.utils.playControl.PlayControl.controlBtnLast(PlayControl.java:122)
1566550586.422 28478-28478/com.stone.stonemusic W/System.err: at com.stone.stonemusic.ui.activity.PlayActivity.onClick(PlayActivity.java:223)
1566550586.422 28478-28478/com.stone.stonemusic W/System.err: at android.view.View.performClick(View.java:5647)
1566550586.422 28478-28478/com.stone.stonemusic W/System.err: at android.view.ViewP e r f o r m C l i c k . r u n ( V i e w . j a v a : 22465 ) 1566550586.42228478 − 28478 / c o m . s t o n e . s t o n e m u s i c W / S y s t e m . e r r : a t a n d r o i d . o s . H a n d l e r . h a n d l e C a l l b a c k ( H a n d l e r . j a v a : 754 ) 1566550586.42328478 − 28478 / c o m . s t o n e . s t o n e m u s i c W / S y s t e m . e r r : a t a n d r o i d . o s . H a n d l e r . d i s p a t c h M e s s a g e ( H a n d l e r . j a v a : 95 ) 1566550586.42328478 − 28478 / c o m . s t o n e . s t o n e m u s i c W / S y s t e m . e r r : a t a n d r o i d . o s . L o o p e r . l o o p ( L o o p e r . j a v a : 163 ) 1566550586.42328478 − 28478 / c o m . s t o n e . s t o n e m u s i c W / S y s t e m . e r r : a t a n d r o i d . a p p . A c t i v i t y T h r e a d . m a i n ( A c t i v i t y T h r e a d . j a v a : 6393 ) 1566550586.42328478 − 28478 / c o m . s t o n e . s t o n e m u s i c W / S y s t e m . e r r : a t j a v a . l a n g . r e f l e c t . M e t h o d . i n v o k e ( N a t i v e M e t h o d ) 1566550586.42428478 − 28478 / c o m . s t o n e . s t o n e m u s i c W / S y s t e m . e r r : a t c o m . a n d r o i d . i n t e r n a l . o s . Z y g o t e I n i t PerformClick.run(View.java:22465) 1566550586.422 28478-28478/com.stone.stonemusic W/System.err: at android.os.Handler.handleCallback(Handler.java:754) 1566550586.423 28478-28478/com.stone.stonemusic W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95) 1566550586.423 28478-28478/com.stone.stonemusic W/System.err: at android.os.Looper.loop(Looper.java:163) 1566550586.423 28478-28478/com.stone.stonemusic W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6393) 1566550586.423 28478-28478/com.stone.stonemusic W/System.err: at java.lang.reflect.Method.invoke(Native Method) 1566550586.424 28478-28478/com.stone.stonemusic W/System.err: at com.android.internal.os.ZygoteInitPerformClick.run(View.java:22465)1566550586.4222847828478/com.stone.stonemusicW/System.err:atandroid.os.Handler.handleCallback(Handler.java:754)1566550586.4232847828478/com.stone.stonemusicW/System.err:atandroid.os.Handler.dispatchMessage(Handler.java:95)1566550586.4232847828478/com.stone.stonemusicW/System.err:atandroid.os.Looper.loop(Looper.java:163)1566550586.4232847828478/com.stone.stonemusicW/System.err:atandroid.app.ActivityThread.main(ActivityThread.java:6393)1566550586.4232847828478/com.stone.stonemusicW/System.err:atjava.lang.reflect.Method.invoke(NativeMethod)1566550586.4242847828478/com.stone.stonemusicW/System.err:atcom.android.internal.os.ZygoteInitMethodAndArgsCaller.run(ZygoteInit.java:933)
1566550586.424 28478-28478/com.stone.stonemusic W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)

原因:

这是我的源码

    //准备
    public static void prepare(String path) {
        if (getMediaPlayer() != null) {
            try {

                getMediaPlayer().reset();
                getMediaPlayer().setDataSource(path);
                getMediaPlayer().prepare();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    //开始
    public static void start() {
        if (getMediaPlayer() != null) {
            getMediaPlayer().start();
            MediaUtils.currentState = MediaStateCode.PLAY_START;
        }
    }

其实这样写是没有问题的,在调用本地音乐的时候,在调用网络歌曲的时候,高概率会出现上面报的java.lang.IllegalStateException异常。
出现这个异常的原因是调用方法的时机或者状态不对。然后我查阅了MediaPlay的生命周期流程图。下面附图。

Alt
参考一篇文章之后,发现是在reset()之后调用MediaPlayer对象的getDuration()方法引起的,所以我就不调用getDuration()方法,就解决了。

解释如下:
Idle 状态:当使用new()方法创建一个MediaPlayer对象或者调用了其reset()方法时,该MediaPlayer对象处于idle状态。这两种方法的一个重要差别就是:如果在这个状态下调用了getDuration()等方法(相当于调用时机不正确),通过reset()方法进入idle状态的话会触发OnErrorListener.onError(),并且MediaPlayer会进入Error状态;如果是新创建的MediaPlayer对象,则并不会触发onError(),也不会进入Error状态。
参考链接:https://blog.csdn.net/ddna/article/details/5178864

所以在出现MediaPlay有问题的情况下,还是看看他的状态和生命周期流程图比较好。


版权声明:本文为stoneWang_L原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。