くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

AndroidのToolBarとYoutubePlayerをいっしょにつかう

昔こんな記事を書いていて、AndroidYoutube動画を再生していましたが、

ToolBarやDesignSupportLibを使おうと思ってはまった。。。ので、そのときの備忘録

wannabe-jellyfish.hatenablog.com

[PR] BabyTuba v1.3をリリースしました!

f:id:wannabe-jellyfish:20141211231420p:plain

wannabe-jellyfish.hatenablog.com

はまったこと

前の記事ではYouTubeBaseActivityを継承したActivityを使ってたのが主なはまりポイント。。。

YouTubeBaseActivityではなく、YouTubePlayerSupportFragmentを使わないといけなかった!

複雑なActivityたちの継承関係

ToolBarやDesignSupportLibを使いたい場合、ベースとなるActivityはandroid.support.v7.app.AppCompatActivityでないといけない。。。

だけどYouTube Android APIのリファレンスによると継承関係はこんな感じ。。。

android.app.Activity
 |− com.google.android.youtube.player.YouTubeBaseActivity

ですが、YouTube Android APIでは、Fragmentも提供されてます!!

なのでそちらを利用するんですが、YouTubePlayerSupportFragmentのほうを追加います!

YouTubePlayerSupportFragment  |  YouTube Android API  |  Google Developers

android.support.v4.app.Fragment
 |− com.google.android.youtube.player.YouTubePlayerSupportFragment

YouTubePlayerFragmentもあるんですが、こちらはSupportLibに対応していないので、ご注意を!!

YouTubePlayerFragment  |  YouTube Android API  |  Google Developers

android.app.Fragment
 |− com.google.android.youtube.player.YouTubePlayerFragment

実際にYouTubeSupportFragmentを使ってみる

上記のポイントを押さえていれば、特にむずかしいとこはない感じ

Layout XML側はこんな感じ

Layout XMLには、<Toolbar>YouTubePlayerSupportFragmentを指定した<fragment>を用意する

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">

  <!-- Tool Bar -->
  <android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

  <!-- Main Contents -->
  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <!-- Player -->
    <fragment
      android:id="@+id/view_player"
      android:name="com.google.android.youtube.player.YouTubePlayerSupportFragment"
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:layout_gravity="center_vertical"
      android:layout_weight="3" />
    <LinearLayout
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:layout_weight="1"
      android:orientation="vertical" >
      <ListView
        android:id="@+id/list_related_videos"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    </LinearLayout>
  </LinearLayout>
</LinearLayout>

Java側はこんな感じ

Java側ではAppCompatActivityを継承したActivityを使って

getSupportFragmentManager()からYouTubePlayerSupportFragmentを取得し、

YouTubePlayerSupportFragment.initialize(DEVELOPER_KEY, this);で初期化すればOK

public class PlayerActivity extends AppCompatActivity implements YouTubePlayer.OnInitializedListener {
    private static final String DEVELOPER_KEY = "your api key";
    private static final String VIDEO_ID = "play video id"
    private static final int RECOVERY_DIALOG_REQUEST = 1;
    Toolbar mToolBar;
    YouTubePlayer mPlayer;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_player);

        //ToolBarをセット
        mToolBar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(mToolBar);

        // YouTubeフラグメントインスタンスを取得
        YouTubePlayerSupportFragment fragment = (YouTubePlayerSupportFragment) getSupportFragmentManager().findFragmentById(R.id.view_player);
        // YouTubeフラグメントのプレーヤーを初期化する
        fragment.initialize(DEVELOPER_KEY, this);
    }

    // YouTubeプレーヤーの初期化成功
    @Override
    public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean wasRestored) {
        if (!wasRestored) {
            mPlayer = player;
            mPlayer.loadVideo(VIDEO_ID);
            mPlayer.play();
        }
    }

    // YouTubeプレーヤーの初期化失敗
    @Override
    public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult errorReason) {
        // YouTube error
        if (errorReason.isUserRecoverableError()) {
            errorReason.getErrorDialog(this, RECOVERY_DIALOG_REQUEST).show();
        } else {
            String errorMessage = String.format(getString(jp.memorylovers.youtube_lib.R.string.error_player), errorReason.toString());
            Toast.makeText(getApplicationContext(), errorMessage, Toast.LENGTH_LONG).show();
        }
    }
}

以上!!

参考にしたサイト様