YouTube Android 播放器 API - ExceptionInInitializerError

YouTube Android Player API - ExceptionInInitializerError

注意:我使用的是 YouTube Android Player API

预期行为:

See the problem in action here

YouTubeFailureRecoveryActivity.java(这包含在 sample/src/com/examples/youtubeapidemo 下的库中)

主要Activity

package test.testapp;

import android.content.pm.ActivityInfo;
import android.os.Bundle;

import com.google.android.youtube.player.YouTubePlayer;
import com.google.android.youtube.player.YouTubePlayerView;

public class MainActivity extends YouTubeFailureRecoveryActivity implements YouTubePlayer.OnFullscreenListener {

    static final String API_KEY = "PLACE YOUTUBE DATA API KEY HERE";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        YouTubePlayerView youTubeView = (YouTubePlayerView) findViewById(R.id.youtube_view);
        youTubeView.initialize(API_KEY, this);
    }

    @Override
    public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean wasRestored) {
        youTubePlayer.setOnFullscreenListener(this);
        youTubePlayer.setFullscreenControlFlags(YouTubePlayer.FULLSCREEN_FLAG_CONTROL_SYSTEM_UI);
        if(!wasRestored){
            youTubePlayer.cueVideo("wKJ9KzGQq0w");
        }
    }

    protected YouTubePlayer.Provider getYouTubePlayerProvider() {
        return (YouTubePlayerView) findViewById(R.id.youtube_view);
    }

    @Override
    public void onFullscreen(boolean isFullscreen) {
        if(isFullscreen){
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        }else if(!isFullscreen){
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="test.testapp.MainActivity">

    <com.google.android.youtube.player.YouTubePlayerView
        android:id="@+id/youtube_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </com.google.android.youtube.player.YouTubePlayerView>

</LinearLayout>

堆栈跟踪

06-10 09:47:09.205 2646-2646/test.testapp E/AndroidRuntime: FATAL EXCEPTION: main
    java.lang.ExceptionInInitializerError
        at android.support.v7.widget.RecyclerView.onSaveInstanceState(SourceFile:201)
        at android.view.View.dispatchSaveInstanceState(View.java:11839)
        at android.view.ViewGroup.dispatchFreezeSelfOnly(ViewGroup.java:2576)
        at android.support.v7.widget.RecyclerView.dispatchSaveInstanceState(SourceFile:220)
        at android.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:2562)
        at android.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:2562)
        at android.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:2562)
        at android.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:2562)
        at android.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:2562)
        at android.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:2562)
        at android.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:2562)
        at android.view.View.saveHierarchyState(View.java:11822)
        at com.android.internal.policy.impl.PhoneWindow.saveHierarchyState(PhoneWindow.java:1566)
        at android.app.Activity.onSaveInstanceState(Activity.java:1188)
        at com.google.android.youtube.player.YouTubeBaseActivity.onSaveInstanceState(Unknown Source)
        at android.app.Activity.performSaveInstanceState(Activity.java:1137)
        at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1215)
        at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3486)
        at android.app.ActivityThread.access0(ActivityThread.java:130)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1201)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4745)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NoClassDefFoundError: rt
        at rs.<clinit>(SourceFile:17)
        at android.support.v7.widget.RecyclerView.onSaveInstanceState(SourceFile:201) 
        at android.view.View.dispatchSaveInstanceState(View.java:11839) 
        at android.view.ViewGroup.dispatchFreezeSelfOnly(ViewGroup.java:2576) 
        at android.support.v7.widget.RecyclerView.dispatchSaveInstanceState(SourceFile:220) 
        at android.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:2562) 
        at android.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:2562) 
        at android.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:2562) 
        at android.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:2562) 
        at android.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:2562) 
        at android.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:2562) 
        at android.view.ViewGroup.dispatchSaveInstanceState(ViewGroup.java:2562) 
        at android.view.View.saveHierarchyState(View.java:11822) 
        at com.android.internal.policy.impl.PhoneWindow.saveHierarchyState(PhoneWindow.java:1566) 
        at android.app.Activity.onSaveInstanceState(Activity.java:1188) 
        at com.google.android.youtube.player.YouTubeBaseActivity.onSaveInstanceState(Unknown Source) 
        at android.app.Activity.performSaveInstanceState(Activity.java:1137) 
        at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1215) 
        at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3486) 
        at android.app.ActivityThread.access0(ActivityThread.java:130) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1201) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:137) 
        at android.app.ActivityThread.main(ActivityThread.java:4745) 
        at java.lang.reflect.Method.invokeNative(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:511) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
        at dalvik.system.NativeStart.main(Native Method) 

由于配置更改,应用程序在重新启动时似乎崩溃了

https://developer.android.com/guide/topics/resources/runtime-changes.html

您可以禁用针对方向更改的自动 activity 重新创建,并自行处理。

为此,添加

android:configChanges="orientation|screenLayout|screenSize"

仅凭方向可能会起作用,但我认为其他方向也会在某些设备上触发。

然后,如果需要,您可以重写 onConfigurationChanged() 来更改方向,例如显示/隐藏视图等。因为 Android 不会 自动重新创建您的布局(这就是它在方向更改时重新启动 activity 时所做的)

所以你可以这样做:

@Override
public void onConfigurationChanged(final Configuration newConfiguration) {

      Log.wtf(
        "Orientation", 
        newConfiguration.orientation == Configuration.ORIENTATION_PORTRAIT 
             ? "portrait"
             : "landscape"
      );

}