我的应用使用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上仍有相当多的设备。
边信息
崩溃发生在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()函数(触发崩溃的函数),我会得到相同的原始错误。
答案 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...
}
});