【问题标题】:YouTube Android Player API - ExceptionInInitializerErrorYouTube Android 播放器 API - ExceptionInInitializerError
【发布时间】:2017-11-12 07:28:20
【问题描述】:

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

预期行为:

  • 当视频不是全屏时,Activity 保持纵向模式(由AndroidManifest ok 强制执行)。
  • 当视频进入全屏模式时,Activity 设置为横向(ok)。
  • 当用户退出全屏模式时,Activity 返回纵向(ExceptionInInitializerError 出现在此处)。

See the problem in action here

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

主要活动

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.access$700(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.access$700(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) 

【问题讨论】:

    标签: java android youtube screen-orientation android-youtube-api


    【解决方案1】:

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

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

    您可以为方向更改禁用自动活动重新创建,并自行处理。

    为此,添加

    android:configChanges="orientation|screenLayout|screenSize"
    

    单独使用方向可能会起作用,但我认为其他一些设备也会触发。

    然后,如果需要,您可以覆盖 onConfigurationChanged() 以执行方向更改的操作,例如显示/隐藏视图等。因为 Android 将不会自动重新创建您的布局(就是这样在方向改变时重新启动活动时会这样做)

    所以你可以这样做:

    @Override
    public void onConfigurationChanged(final Configuration newConfiguration) {
    
          Log.wtf(
            "Orientation", 
            newConfiguration.orientation == Configuration.ORIENTATION_PORTRAIT 
                 ? "portrait"
                 : "landscape"
          );
    
    }
    

    【讨论】:

    • 除此之外,您还掩盖了如果尝试重新启动 Youtube Player 可能会崩溃的事实。当您的应用程序在后台,被 android 销毁,然后重新打开时,这可能会发生......
    • 根据我的经验,yt 播放器经常崩溃,所以我最终将它用作片段,然后在每个 onStop 上手动销毁它。
    猜你喜欢
    • 2014-11-12
    • 2019-01-11
    • 2015-02-02
    • 2021-11-21
    • 1970-01-01
    • 2016-12-06
    • 2015-05-21
    • 2020-01-23
    相关资源
    最近更新 更多