Getting a lot of crashes from android youtube player api

可紊 提交于 2019-12-22 10:36:42

问题


I am using version 1.2.1 (tried with latest version 1.2.2) of android's youtube player api. It works fine on most of the devices. However now and then, I keep on getting crashes on crashlytics. I am getting the following crashes

Fatal Exception: java.lang.IllegalStateException: android.os.TransactionTooLargeException
   at com.google.android.youtube.api.jar.client.RemoteEmbeddedPlayer.x(SourceFile:558)
   at bpd.w(SourceFile:576)
   at tef.onTransact(SourceFile:390)
   at android.os.Binder.transact(Binder.java:395)
   at com.google.android.youtube.player.internal.d$a$a.r(Unknown Source)
   at com.google.android.youtube.player.internal.s.h(Unknown Source)
   at com.google.android.youtube.player.YouTubePlayerView.e(Unknown Source)
   at com.google.android.youtube.player.YouTubePlayerSupportFragment.onSaveInstanceState(Unknown Source)
   at android.support.v4.app.Fragment.performSaveInstanceState(Fragment.java:1936)
   at android.support.v4.app.FragmentManagerImpl.saveFragmentBasicState(FragmentManager.java:1654)
   at android.support.v4.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1722)
   at android.support.v4.app.Fragment.performSaveInstanceState(Fragment.java:1938)
   at android.support.v4.app.FragmentManagerImpl.saveFragmentBasicState(FragmentManager.java:1654)
   at android.support.v4.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1722)
   at android.support.v4.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:527)
   at com.newshunt.news.activities.NewsBaseActivity.onSaveInstanceState(NewsBaseActivity.java:56)
   at com.newshunt.news.activities.NewsDetailsActivity.onSaveInstanceState(NewsDetailsActivity.java:613)
   at android.app.Activity.performSaveInstanceState(Activity.java:1388)
   at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1286)
   at android.app.ActivityThread.callCallActivityOnSaveInstanceState(ActivityThread.java:4588)
   at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3960)
   at android.app.ActivityThread.handleStopActivity(ActivityThread.java:4023)
   at android.app.ActivityThread.access$1200(ActivityThread.java:181)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1498)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:145)
   at android.app.ActivityThread.main(ActivityThread.java:6117)
   at java.lang.reflect.Method.invoke(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:372)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

Also getting crashes for the following exception.

Fatal Exception: java.lang.IllegalStateException: android.os.DeadObjectException
   at com.google.android.apps.youtube.api.jar.a.eo.surfaceDestroyed(SourceFile:236)
   at android.view.SurfaceView.updateWindow(SurfaceView.java:589)
   at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:237)
   at android.view.View.dispatchDetachedFromWindow(View.java:12854)
   at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2757)
   at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:2757)
   at android.view.ViewGroup.removeViewInternal(ViewGroup.java:3844)
   at android.view.ViewGroup.removeViewInternal(ViewGroup.java:3819)
   at android.view.ViewGroup.removeView(ViewGroup.java:3751)
   at com.google.android.youtube.player.YouTubePlayerView$1.b(Unknown Source)
   at com.google.android.youtube.player.internal.r.h(Unknown Source)
   at com.google.android.youtube.player.internal.r$e.onServiceDisconnected(Unknown Source)
   at android.app.LoadedApk$ServiceDispatcher.doDeath(LoadedApk.java:1111)
   at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1125)
   at android.os.Handler.handleCallback(Handler.java:725)
   at android.os.Handler.dispatchMessage(Handler.java:92)
   at android.os.Looper.loop(Looper.java:176)
   at android.app.ActivityThread.main(ActivityThread.java:5317)
   at java.lang.reflect.Method.invokeNative(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:511)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
   at dalvik.system.NativeStart.main(NativeStart.java)

The crash happens to appear in specific versions of youtube application like 5.2.27. Although there are a lot of issues filed for these crashes, there has been no reply from the youtube developers on how to mitigate this issue.

Some of the fellow developers have suggested the following workarounds

1) Use loadVideo instead of cueVideo. But I cannot use this workaround because loadVideo always autoplays the video which is not a requirement of my application. Also someone mentioned that with loadVideo also, this problem is happening although in some different version.

2) Put check in the code to check the youtube application version and then put the specific code. Now the problem with this approach is that I have to check each and every version of youtube app ever released and check which versions are causing the issue which is not a good workaround.

Now is there any fix which I can apply to avoid this issue or are the youtube developers planning to release some jar which internally takes care of all these issues?


回答1:


I reduced the bug occurrence by putting youtube calls (like youtubePlayer.loadVideo(), cueVideo(), getCurrentTimeMillis() etc.) in a try catch block and catch the IllegalStateException exception then reinitialize youtube player.

To create a new instance of the YoutubePlayer just call the initialize() method in the catch block.

Example:

 if (youtubePlayer != null) {
        try {
            youtubePlayer.loadVideo(videoId);
        } catch (IllegalStateException e) {
            initialize(API_KEY, this);
        }
    }

but the bug still occurred , I worked around it by catching these exceptions and restart activity. This uncaught exceptions and to catch them you need to use UncaughtExceptionHandler

example :

 private Thread.UncaughtExceptionHandler defaultUEH;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    defaultUEH = Thread.getDefaultUncaughtExceptionHandler();

    // setup handler for uncaught exception
    Thread.setDefaultUncaughtExceptionHandler(_unCaughtExceptionHandler);
}

   private Thread.UncaughtExceptionHandler _unCaughtExceptionHandler =
                new Thread.UncaughtExceptionHandler() {
                    @Override
                    public void uncaughtException(Thread thread, Throwable ex) {
                        Log.e(TAG, "uncaughtException: ", ex);
                        PendingIntent myActivity = PendingIntent.getActivity(getApplicationContext(),
                                192837, new Intent(getApplicationContext(), MainActivity.class),
                                PendingIntent.FLAG_ONE_SHOT);

                        AlarmManager alarmManager;
                        alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
                        alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                                15000, myActivity );
                        System.exit(2);

                        // re-throw critical exception further to the os (important)
                        defaultUEH.uncaughtException(thread, ex);
                    }
                };



回答2:


The android YouTube Player API is not stable, there are known bugs in it. The team from YouTube said that they will release a new version of the library.

For now, the best solution I have found is to build my own library.



来源:https://stackoverflow.com/questions/36419493/getting-a-lot-of-crashes-from-android-youtube-player-api

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!