为什么 YT 播放器会导致膨胀导致 App 崩溃

问题描述

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

应用程序不断崩溃,因为我需要在 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 视频

解决方法

使用 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,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);
        }
    }
}