【问题标题】:How to use YouTube Android Player API with AppCompatActivity如何将 YouTube Android Player API 与 AppCompatActivity 一起使用
【发布时间】:2018-06-24 18:14:30
【问题描述】:

为了在我的应用中播放视频,我决定扩展 YouTube Android Player API。但问题是我的菜单消失了,因为我没有从 AppCompatActivity 扩展。问题是:如何使用 YouTube Android Player API 并在应用中有菜单?

public class TutorialsActivity extends YouTubeBaseActivity {

private YouTubePlayerView youTubePlayerView;

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.youtube);

    youTubePlayerView = (YouTubePlayerView) findViewById(R.id.video1);
    youTubePlayerView.initialize(API_KEY, new YouTubePlayer.OnInitializedListener() {
        @Override
        public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) {
            youTubePlayer.loadVideo("c9q88492aas");
            youTubePlayer.setPlayerStyle(YouTubePlayer.PlayerStyle.MINIMAL);
        }

        @Override
        public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {

        }
    });
}

XML

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

当我从 AppCompatActivity 扩展时,它只会给我一个错误。

错误日志:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.hyber.app/com.hyber.app.TutorialsActivity}: android.view.InflateException: Binary XML file line #12: Binary XML file line #12: Error inflating class com.google.android.youtube.player.YouTubePlayerView

【问题讨论】:

  • 不扩展AppCompatActivity的原因是什么?
  • @PierfrancescoSoffritti 它崩溃了,我在描述中添加了日志。
  • @Nikolai 请看我的回答here
  • 我之前也尝试过,但无法做到,所以我在对话框中实现了它,如果您需要帮助在对话框中实现它,请告诉我。

标签: android android-youtube-api


【解决方案1】:

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

了解更多信息here

活动代码:-

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" />

【讨论】:

    【解决方案2】:

    利用应用AppCompatDelegate

    例如:

    1)将 AppCompatDelegate 添加到您的活动中

    public class MainActivity extends Activity implements AppCompatCallback {
    
        @Override
        public void onSupportActionModeStarted(ActionMode mode) {
          //let's leave this empty, for now
        }
    
        @Override
        public void onSupportActionModeFinished(ActionMode mode) {   
          // let's leave this empty, for now
        }
    

    然后,在我们Activity的onCreate()中:

    i) 使用 AppCompatDelegate.create() 创建 AppCompatDelegate

    ii) 调用 AppCompatDelegate.onCreate()(有一些 Activity 生命周期方法应该代理给委托)

    iii) 使用 AppCompatDelegate.setContentView() 扩展布局

    iv) 使用 AppCompatDelegate.setSupportActionbar() 将工具栏添加到委托

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        //let's create the delegate, passing the activity at both arguments (Activity, AppCompatCallback)
        delegate = AppCompatDelegate.create(this, this);
    
        //we need to call the onCreate() of the AppCompatDelegate
        delegate.onCreate(savedInstanceState);
    
        //we use the delegate to inflate the layout
        delegate.setContentView(R.layout.activity_main);
    
        //Finally, let's add the Toolbar
        Toolbar toolbar= (Toolbar) findViewById(R.id.my_awesome_toolbar);
        delegate.setSupportActionBar(toolbar);
    }
    

    更多详情,

    https://medium.com/google-developer-experts/how-to-add-toolbar-to-an-activity-which-doesn-t-extend-appcompatactivity-a07c026717b3

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-02
      • 1970-01-01
      • 2018-06-29
      • 2013-01-03
      • 1970-01-01
      • 2016-12-17
      • 1970-01-01
      相关资源
      最近更新 更多