繁体   English   中英

java.lang.IllegalStateException:android.media.MediaPlayer.stop

[英]java.lang.IllegalStateException: android.media.MediaPlayer.stop

我注意到,我的许多应用程序用户都通过Crashlytics受此异常影响:

Non-fatal Exception: java.lang.IllegalStateException
       at android.media.MediaPlayer._stop(MediaPlayer.java)
       at android.media.MediaPlayer.stop + 1437(MediaPlayer.java:1437)
       at com.allattentionhere.autoplayvideos.AAH_CustomVideoView.onSurfaceTextureDestroyed + 256(AAH_CustomVideoView.java:256)
       at android.view.TextureView.releaseSurfaceTexture + 249(TextureView.java:249)
       at android.view.TextureView.onDetachedFromWindowInternal + 222(TextureView.java:222)
       at android.view.View.dispatchDetachedFromWindow + 17586(View.java:17586)
       at android.view.ViewGroup.dispatchDetachedFromWindow + 3756(ViewGroup.java:3756)
       at android.view.ViewGroup.dispatchDetachedFromWindow + 3756(ViewGroup.java:3756)
       at android.view.ViewGroup.dispatchDetachedFromWindow + 3756(ViewGroup.java:3756)
       at android.view.ViewGroup.removeViewInternal + 5320(ViewGroup.java:5320)
       at android.view.ViewGroup.removeViewAt + 5267(ViewGroup.java:5267)
       at androidx.recyclerview.widget.RecyclerView$5.removeViewAt + 877(RecyclerView.java:877)
       at androidx.recyclerview.widget.ChildHelper.removeViewAt + 168(ChildHelper.java:168)
       at androidx.recyclerview.widget.RecyclerView$LayoutManager.removeViewAt + 8374(RecyclerView.java:8374)
       at androidx.recyclerview.widget.RecyclerView$LayoutManager.removeAndRecycleViewAt + 8647(RecyclerView.java:8647)
       at androidx.recyclerview.widget.LinearLayoutManager.recycleChildren + 1369(LinearLayoutManager.java:1369)
       at androidx.recyclerview.widget.LinearLayoutManager.recycleViewsFromStart + 1415(LinearLayoutManager.java:1415)
       at androidx.recyclerview.widget.LinearLayoutManager.recycleByLayoutState + 1484(LinearLayoutManager.java:1484)
       at androidx.recyclerview.widget.LinearLayoutManager.fill + 1508(LinearLayoutManager.java:1508)
       at androidx.recyclerview.widget.LinearLayoutManager.scrollBy + 1331(LinearLayoutManager.java:1331)
       at androidx.recyclerview.widget.LinearLayoutManager.scrollVerticallyBy + 1075(LinearLayoutManager.java:1075)
       at androidx.recyclerview.widget.RecyclerView.scrollStep + 1832(RecyclerView.java:1832)
       at androidx.recyclerview.widget.RecyclerView$ViewFlinger.run + 5067(RecyclerView.java:5067)
       at android.view.Choreographer$CallbackRecord.run + 1008(Choreographer.java:1008)
       at android.view.Choreographer.doCallbacks + 804(Choreographer.java:804)
       at android.view.Choreographer.doFrame + 729(Choreographer.java:729)
       at android.view.Choreographer$FrameDisplayEventReceiver.run + 994(Choreographer.java:994)
       at android.os.Handler.handleCallback + 794(Handler.java:794)
       at android.os.Handler.dispatchMessage + 99(Handler.java:99)
       at android.os.Looper.loop + 176(Looper.java:176)
       at android.app.ActivityThread.main + 6662(ActivityThread.java:6662)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run + 547(RuntimeInit.java:547)
       at com.android.internal.os.ZygoteInit.main + 873(ZygoteInit.java:873)

这就是我所谓的MediaPlayer.stop

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
        try {
            if (isAndroid5OrGreater()) {
                //pre lollipop needs SurfaceTexture it owns before calling onDetachedFromWindow super
                surface.release();
            }
            if (mMediaPlayer != null) {
                mMediaPlayer.stop();
                mMediaPlayer.release();
                mMediaPlayer = null;
            }

            showThumb.call();
            return true;
        } catch (Exception e) {
            CriticalLogger.error(e);
            return false;
        }
    }

该异常会影响来自不同品牌(小米,三星,摩托罗拉等)的不同设备,并具有不同的Android版本(9、8、7、6),但我无法自行复制。 知道为什么会发生这种情况吗?

在检查了mMediaPlayer的空引用之后,检查其状态是否正在使用.isPlaying()播放,然后调用.stop() 还要在调用.reset()之前调用.release() ,然后使mMediaPlayer引用为null。 订单是这样的:

if (mMediaPlayer.isPlaying()) {
    mMediaPlayer.stop();
    mMediaPlayer.reset();
    mMediaPlayer.release();
    mMediaPlayer=null;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM