YouTube Android 播放器 API 在解组时抛出“BadParcelableException ClassNotFoundException:asc";使用新的 YouTube 版本 [英] YouTube Android Player API throws "BadParcelableException ClassNotFoundException when unmarshalling: asc" with new YouTube version

查看:16
本文介绍了YouTube Android 播放器 API 在解组时抛出“BadParcelableException ClassNotFoundException:asc";使用新的 YouTube 版本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

向 YouTube Android 播放器 API 库工程师提交错误:请参阅 android-youtube-api 标签

在过去一周半的时间里,我注意到这个奇怪的 BadParcelableException 在我们的应用程序中稳步增加,并且已经将其归因于 YouTube 在 Android 上的新版本.

Over the course of the past week and a half, I've noticed this weird BadParcelableException steadily increasing in our app and have nailed it down to YouTube's new release on android.

如果您的应用正在播放 YouTube 视频、将您的应用置于后台、强制停止 Youtube 应用并再次恢复您的应用,则会发生此崩溃.崩溃可在 Youtube 版本 12.19.56 上重现.还在较旧的 YouTube 版本 12.05.21 上进行了测试,没有发生崩溃.

This crash will occur if your app is playing a youtube video, bringing your app to background, force stopping the Youtube app, and resuming your app again. Crash reproducible on Youtube version 12.19.56. Also tested on an older YouTube version 12.05.21 and the crash was not there.

堆栈跟踪:

main Exception: Unable to start activity ComponentInfo{com.myapp.MainActivity}: 
android.os.BadParcelableException: ClassNotFoundException when unmarshalling: asc 
Stack: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.MainActivity}: 
android.os.BadParcelableException: ClassNotFoundException when unmarshalling: asc 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2666) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2727) 
at android.app.ActivityThread.-wrap12(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1478) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:6121) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) Caused by: 
android.os.BadParcelableException: ClassNotFoundException when unmarshalling: asc 
at android.os.Parcel.readParcelableCreator(Parcel.java:2536) 
at android.os.Parcel.readParcelable(Parcel.java:2462) 
at android.os.Parcel.readValue(Parcel.java:2365) 
at android.os.Parcel.readSparseArrayInternal(Parcel.java:2813) 
at android.os.Parcel.readSparseArray(Parcel.java:2068) 
at android.os.Parcel.readValue(Parcel.java:2422) 
at android.os.Parcel.readArrayMapInternal(Parcel.java:2732) 
at android.os.BaseBundle.unparcel(BaseBundle.java:269) 
at android.os.Bundle.getSparseParcelableArray(Bundle.java:934) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1208) 
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595) 
at android.support.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:2893) 
at android.support.v4.app.FragmentController.dispatchCreate(FragmentController.java:190) 
at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:353) 
at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:85) 
at com.myapp.BaseActivity.onCreate(BaseActivity.java:36) 
at com.myapp.MainActivity.onCreate(MainActivity.java:190) 
at android.app.Activity.performCreate(Activity.java:6682) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2619) ... 9 more

Caused by: java.lang.ClassNotFoundException: Didn't find class "asc" on path: DexPathList[[zip file "/data/app/com.myapp-naA-_cCrz-w81rqx98ipcQ==/base.apk"],nativeLibraryDirectories=[/data/app/com.myapp-naA-_cCrz-w81rqx98ipcQ==/lib/arm64, /system/lib64, /vendor/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
... 32 more

更多信息:

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    super.onCreate(savedInstanceState); // Crashing here MainActivity.java:190
    ...
}

推荐答案

视图状态保存和恢复的问题.Youtube 应用程序有一个错误和存储视图状态,其中包含来自 youtube apk 的类 asc 的实例.所以我们的应用程序无法恢复它,因为对这个类一无所知.我的解决方案是通过下一个代码阻止在 YouTubePlayerSupportFragment 中为 YoutubePlayerView 保存视图状态:

The problem in view state saving and restoring. Youtube app have a bug and store view state which contains instance of class asc from youtube apk. So our app can not restore it because known nothing about this class. My solution is preventing view state saving for YoutubePlayerView in YouTubePlayerSupportFragment by next code:

@Override
public void onSaveInstanceState(Bundle bundle) {
    super.onSaveInstanceState(bundle);

    // disable view state saving to prevent saving states from youtube apk which cannot be restored.
    View view = getView();
    if (view instanceof ViewGroup) {
        ViewGroup viewGroup = ((ViewGroup) view);
        for (int i = 0; i < viewGroup.getChildCount(); i++) {
            viewGroup.getChildAt(i).setSaveFromParentEnabled(false);
        }
    }
}

此代码应添加到您的 YouTubePlayerSupportFragment 子类中.此解决方案不会从捆绑中删除 youtube 播放器状态.这样youtube播放器就可以成功恢复了.

This code should be added to your subclass of YouTubePlayerSupportFragment. This solution does not remove youtube player state from bundle. So youtube player will be restored successfully.

这篇关于YouTube Android 播放器 API 在解组时抛出“BadParcelableException ClassNotFoundException:asc";使用新的 YouTube 版本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆