【Kotlin】YouTubeAPIを用いて動画再生まで行う

#はじめに
　この記事では、youtubeAPIを利用してyoutube動画を再生する方法の基本の基本を書き記しています。このAPIを使うには、GoogleAPI keyが必要になるので各自で準備をお願いします。（入手は無料で簡単です。）

#準備
　youtubeAPIをAndroid Studioに実装する必要があります。以下のリンクから、YouTube Android Player APIの最新バージョンをダウンロードしてください。
https://developers.google.com/youtube/android/player/downloads/?hl=ja
　ダウンロードしたzipファイルを解凍し、android studioのlibsフォルダーに移します。ProjectタブのProjectビューからではないとアクセスしにくいので、注意してください。（Androidビューからでは✖）ポップアップはOKを押して、以下の画像のようになったらOKです。

<img width="236" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658219/c68f3dc9-9d8b-0092-cddd-eb6fdf2d1a54.png">
　次に、File>Project Structure>Dependencies>appを開いて、＋ボタンからjar dependencyを選び、youtub APIを選択して、実装を行います。（この操作は不要かもしれませんが、一応記しておきます。）上手くいくと下のようになります。
<img width="713" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658219/4dc9f0b1-4438-bbab-bb92-ce611f96fa8a.png">
　画面最下部にyoutube APIがあることが確認できると思います。これで、ライブラリの実装は完了しました。
　**また、youtubeAPIはエミュレーターにyoutubeがインストールされていないと使えないので、googlePlayにアクセスできるバージョンで開発する必要があります。**

#YoutubeActivityを作る
 今回は、取り敢えず任意のyoutube動画の再生までを行いたいと思います。はじめに、再生したいyoutube動画のリンクを用意してください。プログラムには、**リンクの?v=以後の文字列を使います。**このユニークな文字列によって、APIが動画を特定し出力してくれます。
例：www.youtube.com/watch?v=dEhZzEJrcUEというリンクでは”dEhZzEJrcUE”を使う。
　あとは、コードを記述するだけです。下記にサンプルプログラムを記しておきました。今回は動画再生を行うActivityをYoutubeActivityとしています。**（manifestファイルにて、インターネットのpermissionを記述し忘れないでください）**

```
const val YOUTUBE_VIDEO_ID = "先述した任意の動画の文字列"
class YoutubeActivity : YouTubeBaseActivity(), YouTubePlayer.OnInitializedListener {
    private val TAG = "YoutubeActivity"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val layout = layoutInflater.inflate(R.layout.activity_youtube, null) as ConstraintLayout
        setContentView(layout)

        val playerView = YouTubePlayerView(this)
        playerView.layoutParams = ConstraintLayout.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
        layout.addView(playerView)

        playerView.initialize(GoogleAPIkey, this)
    }

    override fun onInitializationSuccess(provider: YouTubePlayer.Provider?, youTubePlayer: YouTubePlayer?,
                                         wasRestored: Boolean) {
        Log.d(TAG, "onInitializationSuccess: provider is ${provider?.javaClass}")
        Log.d(TAG, "onInitializationSuccess: youTubePlayer is ${youTubePlayer?.javaClass}")
        Toast.makeText(this, "Initialized Youtube Player successfully", Toast.LENGTH_SHORT).show()

        if (!wasRestored) {
            youTubePlayer?.cueVideo(YOUTUBE_VIDEO_ID)
        }
    }

    override fun onInitializationFailure(provider: YouTubePlayer.Provider?,
                                         youTubeInitializationResult: YouTubeInitializationResult?) {
        val REQUEST_CODE = 0

        if (youTubeInitializationResult?.isUserRecoverableError == true) {
            youTubeInitializationResult.getErrorDialog(this, REQUEST_CODE).show()
        } else {
            val errorMessage = "There was an error initializing the YoutubePlayer ($youTubeInitializationResult)"
            Toast.makeText(this, errorMessage, Toast.LENGTH_LONG).show()
        }
    }
}
```
　上記のコードを記述して、YoutubeActicvityをエミュレータ上で動かすと指定した動画が再生されることが分かると思います。ここからは大まかに分かれた各ブロックについて説明していきます。

```
class YoutubeActivity : YouTubeBaseActivity(), YouTubePlayer.OnInitializedListener {
```

　まず、youtube動画を再生させるActivityには`YouTubeBaseActivity()`というクラスの継承と、`YouTubePlayer.OnInitializedListener()`というインターフェースの実装が必要です。前者は、 `YouTubePlayerView`というyoutube動画を再生されるのに必要なviewを組み込むために必要で、`YouTubePlayer.OnInitializedListener()`はAPIキーを認証して動画再生させるのに必要な初期化という過程を行うのに必要となります。

```
 val playerView = YouTubePlayerView(this)
        playerView.layoutParams = ConstraintLayout.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
        layout.addView(playerView)
```
　次にこの部分についてです。この部分で、先述したyoutube動画を再生するviewである`YouTubePlayerView`をレイアウトに動的に追加しています。レイアウトファイルからは直接追加が出来ないので、この方法を取っています。

```
playerView.initialize(GoogleAPIkey, this)
```
　この箇所で、`YouTubePlayerView`の初期化を行っています。準備したAPIキーを使って認証を行い、動画再生を行います。この処理が上手くいった場合と行かなかった場合に分岐して、下に記してあるメソッドが実行されます。

```
override fun onInitializationSuccess(provider: YouTubePlayer.Provider?, youTubePlayer: YouTubePlayer?,
                                         wasRestored: Boolean) {
        Log.d(TAG, "onInitializationSuccess: provider is ${provider?.javaClass}")
        Log.d(TAG, "onInitializationSuccess: youTubePlayer is ${youTubePlayer?.javaClass}")
        Toast.makeText(this, "Initialized Youtube Player successfully", Toast.LENGTH_SHORT).show()

        if (!wasRestored) {
            youTubePlayer?.cueVideo(YOUTUBE_VIDEO_ID)
        }
    }
```
 これは、インターフェース`YouTubePlayer.OnInitializedListener()`に指定されたメソッドの一つで、先述した初期化が成功した時の処理を行います。今回は、ログとトーストで正しく実行されたことを分かりやすく表示させる処理を最初に書いています。その後のif文で、wasRestoredというパラメータで条件分岐させています。ここでwasRestoredは

```
wasRestored : YouTubePlayerView または YouTubePlayerFragment が状態を復元する処理の一部として、プレーヤーが以前に保存された状態から復元したかどうかを示します。 通常、true はユーザーが予期した状態から再生が復元しており、新しい動画が読み込まれないことを意味します。
```
と、公式のリファレンスにあるのでfalseの時だけ動画の再生を促すために、`youTubePlayer?.cueVideo(YOUTUBE_VIDEO_ID)`を使って動画再生を行います。引数は初めに準備するようお願いした、任意のyoutube動画リンク末尾の文字列です。
　`YouTubePlayer`に続く`cueVideo`メソッドは動画のサムネイルだけ表示して、ユーザーがタップした時にはじめて再生をさせる機能を持ちます。自動的に再生をさせたいなら`loadVideo()`を使ってください。このように、動画再生だけでも様々な機能の幅があるので、別の記事で紹介出来たらしようと思います。詳しくは公式リファレンスを参照してください。

```
override fun onInitializationFailure(provider: YouTubePlayer.Provider?,
                                         youTubeInitializationResult: YouTubeInitializationResult?) {
        val REQUEST_CODE = 0

        if (youTubeInitializationResult?.isUserRecoverableError == true) {
            youTubeInitializationResult.getErrorDialog(this, REQUEST_CODE).show()
        } else {
            val errorMessage = "There was an error initializing the YoutubePlayer ($youTubeInitializationResult)"
            Toast.makeText(this, errorMessage, Toast.LENGTH_LONG).show()
        }
    }
```

 最後にonInitializationFailureを実装します。これもインターフェースによって実装が義務付けられているメソッドで、インターネットのトラブルや端末のトラブルで、初期化に失敗した場合に実行される処理です。今回は実行されたことをトーストに表示させてあげるための処理だけ書いてあります。
　以上で細かい点の解説を含め終わりです。次は、動画再生の細かい設定や別Activity再生させる方法などを書きたいと思います。アプリ開発初心者なので、細かい用語の使い方や認識が誤っている場合があるので、ぜひその時はコメントを下さい！

#参考文献
YouTubeAPI公式リファレンス
https://developers.google.com/youtube/android/player/reference/com/google/android/youtube/player/package-summary?hl=ja