最新的Youtube API使Android 4.0.4下的应用程序崩溃

时间:2014-11-30 10:35:08

标签: android youtube-api google-play-services

我的应用使用Youtube API播放视频。我已经开发了一年多,所以我已经介绍了不同的Youtube App版本,从最初的版本(与Google服务分离,完美无缺)到最新版本,这些版本更复杂,甚至无声下载并从谷歌安装JARS。

运行 Android 4.0.4 的设备上的最新 Youtube App 5.17.6 。我有最新的Google Play服务lib jar rev.21(3.2Mb !!)任何通过API播放视频的尝试都会导致 Youtube应用程序崩溃,然后我的应用程序也会崩溃。

即使我们谈论的是过时的Android版本,但ICS上仍有相当多的设备。

边信息

  • Google Play服务JAR rev.21,也尝试过rev.10-rev15
  • Youtube APP 5.17.6。旧版本可以使用。
  • Android 4.0.4失败,但Android 4.0.3,4.2.1,4.2.2和4.4.4正常工作
  • Youtube API演示崩溃,所有这些(Fragment / View / CustomControls ......)
  • 我使用YoutubeSupportFragment(但它不重要,视图也不起作用)

崩溃发生在Youtube App内部(“不幸的是YouTube已停止”),似乎来自下载的广告JAR:

D/dalvikvm( 4561): DEX prep '/data/data/com.google.android.youtube/cache/ads1113889427.jar': unzip in 0ms, rewrite 183ms

E/AndroidRuntime( 4561): FATAL EXCEPTION: Thread-635
E/AndroidRuntime( 4561): java.lang.ExceptionInInitializerError
E/AndroidRuntime( 4561):    at com.google.android.a.t.a(SourceFile:75)
E/AndroidRuntime( 4561):    at com.google.android.gms.ads.adshield.a.a.<init>(SourceFile:24)
E/AndroidRuntime( 4561):    at com.google.android.gms.ads.adshield.AdShieldCreatorImpl.a(SourceFile:24)
E/AndroidRuntime( 4561):    at com.google.android.gms.ads.adshield.a.e.onTransact(SourceFile:55)
E/AndroidRuntime( 4561):    at android.os.Binder.transact(Binder.java:297)
E/AndroidRuntime( 4561):    at ehb.a(Unknown Source)
E/AndroidRuntime( 4561):    at egs.a(Unknown Source)
E/AndroidRuntime( 4561):    at dxw.<init>(Unknown Source)
E/AndroidRuntime( 4561):    at eig.c(SourceFile:142)
E/AndroidRuntime( 4561):    at eig.a(SourceFile:139)
E/AndroidRuntime( 4561):    at epu.b(SourceFile:92)
E/AndroidRuntime( 4561):    at epu.b_(SourceFile:76)
E/AndroidRuntime( 4561):    at eih.c(SourceFile:158)
E/AndroidRuntime( 4561):    at eih.a(SourceFile:154)
E/AndroidRuntime( 4561):    at epu.b(SourceFile:92)
E/AndroidRuntime( 4561):    at epu.b_(SourceFile:76)
E/AndroidRuntime( 4561):    at eif.c(SourceFile:262)
E/AndroidRuntime( 4561):    at ejg.a(SourceFile:37)
E/AndroidRuntime( 4561):    at fgq.j(SourceFile:176)
E/AndroidRuntime( 4561):    at fhg.e(SourceFile:313)
E/AndroidRuntime( 4561):    at fhg.c(SourceFile:25)
E/AndroidRuntime( 4561):    at fgy.h(SourceFile:239)
E/AndroidRuntime( 4561):    at rl.a(SourceFile:132)
E/AndroidRuntime( 4561):    at rl.a(SourceFile:73)
E/AndroidRuntime( 4561):    at ri.a(SourceFile:93)
E/AndroidRuntime( 4561):    at fxp.a(SourceFile:49)
E/AndroidRuntime( 4561):    at qo.run(SourceFile:105)
E/AndroidRuntime( 4561): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
E/AndroidRuntime( 4561):    at android.os.Handler.<init>(Handler.java:121)
E/AndroidRuntime( 4561):    at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:607)
E/AndroidRuntime( 4561):    at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:607)
E/AndroidRuntime( 4561):    at android.os.AsyncTask.<clinit>(AsyncTask.java:190)
E/AndroidRuntime( 4561):    ... 27 more

有什么建议吗?

我已在https://code.google.com/p/gdata-issues/issues/detail?can=2&start=0&num=100&q=youtube%205.17.6&colspec=API%20ID%20Type%20Status%20Priority%20Stars%20Summary&groupby=&sort=&id=6808向Google代码中提交了一个错误...如果您遇到此问题,请提出问题。

修改

添加用于初始化API的@TacBoss技巧,在实例化YouTube API时出现以下错误:

FATAL EXCEPTION: name
E/AndroidRuntime( 4075): java.lang.IllegalStateException: Clients must be created on the UI thread.
E/AndroidRuntime( 4075):    at com.google.android.youtube.player.internal.r.<init>(Unknown Source)
E/AndroidRuntime( 4075):    at com.google.android.youtube.player.internal.o.<init>(Unknown Source)
E/AndroidRuntime( 4075):    at com.google.android.youtube.player.internal.ad.a(Unknown Source)
E/AndroidRuntime( 4075):    at com.google.android.youtube.player.YouTubePlayerView.a(Unknown Source)
E/AndroidRuntime( 4075):    at com.google.android.youtube.player.YouTubePlayerSupportFragment.a(Unknown Source)
E/AndroidRuntime( 4075):    at com.google.android.youtube.player.YouTubePlayerSupportFragment.initialize(Unknown Source)

...如果我只是执行包含在处理程序中的 youtubePlayer.cueVideo()函数(触发崩溃的函数),我会得到相同的原始错误。

1 个答案:

答案 0 :(得分:1)

有些SDK需要同步执行所有操作,并且为了不通过同步所有方法来阻止其他线程,它们将强制使用该SDK的单个线程,作为最明显的Android主线程示例。 (我有使用这种SDK的&#34;愉快&#34;我也认为SDK应该负责管理线程更改)

我不确定这是不是这样,但是现在看来新SDK需要在调用/创建的线程上创建一个处理程序。

我建议创建SDK并可能(取决于您可能遇到的任何其他错误),也可以通过单个HandlerThread使用它。

试试这个:

HandlerThread t=new HandlerThread("name");
t.start();
new Handler(t.getLooper()).post(new Runnable() {
    public void run() { 
        start the SDK...
    }
});

更新

好的,所以SDK要求你在UI线程上初始化它...我建议你在自定义应用程序的onCreate中启动它或使用这段代码:

new Handler(Looper.getMainLooper()).post(new Runnable() {
    public void run() {
        start the SDK...
    }
});