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



My App 使用 Youtube API 播放视频。我已经开发了一年多,所以我涵盖了不同的Youtube应用程序版本,从第一个版本(与谷歌服务无关,完美无缺(到最新版本,它们更复杂,甚至默默地从谷歌下载和安装JARS。

最新的 Youtube 应用程序 5.17.6 在运行 Android 4.0.4 的设备上。我有最新的谷歌播放服务库罐修订版 21 (3.2Mb !!(任何通过 API 播放视频的尝试都会使 Youtube 应用程序崩溃,然后我的应用程序也会崩溃。

尽管我们谈论的是过时的Android版本,但ICS上仍然有很多设备。

侧面信息

  • 谷歌播放服务JAR rev.21,也尝试了rev.10-rev15
  • 优酷应用程序 5.17.6.旧版本有效。
  • Android 4.0.4
  • 失败,但 Android 4.0.3、4.2.1、4.2.2 和 4.4.4 可以正常工作
  • Youtube API 演示也崩溃了,所有这些(片段/视图/自定义控件...
  • 我使用YoutubeSupportFragment(但没关系,视图也不起作用(

崩溃发生在Youtube应用程序内部("不幸的是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 ...如果您也有此问题,请为问题加注星标。

编辑

添加@TacBoss提议的初始化 API 的技巧,我在实例化 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(( 函数(触发崩溃的函数(,我会得到相同的原始错误。

某些 SDK

需要同步执行所有操作,并且为了不通过同步所有方法来阻止其他线程,它们将强制使用该 SDK 的单个线程,作为最明显的 Android 主线程示例。(我有使用这种SDK的"乐趣",我也认为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...
    }
});

相关内容

  • 没有找到相关文章

最新更新