【问题标题】:Why does YT player causes inflated to crash the App为什么YT播放器会导致App崩溃
【发布时间】:2021-04-14 04:51:03
【问题描述】:

我正在尝试在我的应用中安装 YouTube 播放器。

App 一直崩溃,因为我需要在 MainActivity 中将“extends AppCompatActivity”更改为“YouTubeBaseActivity”,但我的代码正在使用 AppCompatActivity,所以无法更改。

我将代码移至 YouTubeConfig.Java,它看起来像这样:

public class YouTubeConfig extends YouTubeBaseActivity {
    public YouTubeConfig() {}

    private static final String API_KEY = "-";

    public static String getApiKey() {
        return API_KEY;
    }

    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);

        *Code that plays the video. No errors*

}

但是当我启动应用程序时,由于 live_fragment.xml 的代码而崩溃:

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_live, container, false);
    }

live_fragment 链接到 mainActivity 代码:

private BottomNavigationView.OnNavigationItemSelectedListener navListener =
            new BottomNavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                    Fragment selectedFragment = null;

                    switch (item.getItemId()) {
                        case R.id.nav_live:
                            selectedFragment = new LiveFragment();
                            break;
                        case R.id.nav_articles:
                            selectedFragment = new ArticlesFragment();
                            break;
                    }

                    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                            selectedFragment).commit();
                    return true;
                }
            };

这是从一个关于底部导航的 YT 视频中截取的

【问题讨论】:

    标签: android-studio youtube android-youtube-api youtube-iframe-api


    【解决方案1】:

    使用 YouTubePlayerFragment 而不是使用 YouTubePlayerView。正如文档所说:- YouTubePlayerFragment 是一个包含 YouTubePlayerView 的片段。使用此片段是播放 YouTube 视频的首选方式,因为您的 Activity 不需要扩展库提供的 Activity,就像直接使用 YouTubePlayerView 一样。

    活动代码:-

    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.Toast;
    
    import com.google.android.youtube.player.YouTubeInitializationResult;
    import com.google.android.youtube.player.YouTubePlayer;
    import com.google.android.youtube.player.YouTubePlayerFragment;
    
    public class MainActivity extends AppCompatActivity implements YouTubePlayer.OnInitializedListener {
    
        private static final int RECOVERY_DIALOG_REQUEST = 1;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            YouTubePlayerFragment youTubePlayerFragment =
                    (YouTubePlayerFragment) getFragmentManager().findFragmentById(R.id.youtube_fragment);
            youTubePlayerFragment.initialize("api key",
                    this);
        }
    
        @Override
        public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean wasRestored) {
            if (!wasRestored) {
                youTubePlayer.cueVideo("nCgQDjiotG0");
            }
        }
    
        @Override
        public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {
            if (youTubeInitializationResult.isUserRecoverableError()) {
                youTubeInitializationResult.getErrorDialog(this, RECOVERY_DIALOG_REQUEST).show();
            } else {
                String errorMessage = String.format("There was an error initializing the YouTubePlayer (%1$s)", youTubeInitializationResult.toString());
                Toast.makeText(this, errorMessage, Toast.LENGTH_LONG).show();
            }
        }
    
    
    }
    

    布局:-

    <fragment
            android:id="@+id/youtube_fragment"
            android:name="com.google.android.youtube.player.YouTubePlayerFragment"
            android:layout_width="0dp"
            android:layout_height="300dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    

    已编辑!你可以用这个

    public class PlayVideo extends YouTubeBaseActivity implements
            YouTubePlayer.OnInitializedListener {
        private YouTubePlayer YPlayer;
        private static final String YoutubeDeveloperKey = "Your Key";
        private static final int RECOVERY_DIALOG_REQUEST = 1;
    
        //String film = "http://www.youtube.com/watch?v=0C0pk9fAhwA";
        public static final String VIDEO_ID = "0C0pk9fAhwA";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.layoutplayyoutube);
    
    
            YouTubePlayerView youTubeView = (YouTubePlayerView) findViewById(R.id.youtube_view);
            youTubeView.initialize(YoutubeDeveloperKey, this);
    
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
        @Override
        public void onInitializationFailure(YouTubePlayer.Provider provider,
                YouTubeInitializationResult errorReason) {
            if (errorReason.isUserRecoverableError()) {
                errorReason.getErrorDialog(this, RECOVERY_DIALOG_REQUEST).show();
            } else {
                String errorMessage = String.format(
                        "There was an error initializing the YouTubePlayer",
                        errorReason.toString());
                Toast.makeText(this, errorMessage, Toast.LENGTH_LONG).show();
            }
        }
    
        @Override
        public void onInitializationSuccess(Provider provider,
                YouTubePlayer player, boolean wasRestored) {
            if (!wasRestored) {
                YPlayer = player;
                /*
                 * Now that this variable YPlayer is global you can access it
                 * throughout the activity, and perform all the player actions like
                 * play, pause and seeking to a position by code.
                 */
                YPlayer.cueVideo(VIDEO_ID);
            }
        }
    }
    

    【讨论】:

    • 我必须声明这个私有静态最终 int RECOVERY_DIALOG_REQUEST = ;我到底要指出什么?
    • 我在 getMenuInflater().inflate(R.menu.bottom_navigation, menu); 处将 main 更改为 bottom_navigation;由于某种原因它给出了一个错误,所以我改变了它。现在是“youTubeView.initialize(YoutubeDeveloperKey, this);”正在使应用程序崩溃。我完全迷路了:D
    • 看起来是空对象引用?尝试在空对象引用上调用虚拟方法 'void com.google.android.youtube.player.YouTubePlayerView.initialize(java.lang.String, com.google.android.youtube.player.YouTubePlayer$OnInitializedListener)'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多