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 的单个线程,作为最明显的 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...
}
});