Google CastでAndroid TVアプリをリモート起動する

# はじめに
Google Cast の典型的な利用方法は「スマホで見ていたYouTube動画をテレビで再生させる」といったものだ。NetFlixやYouTubeが開発した[DIAL](http://www.dial-multiscreen.org/dial-protocol-specification)と呼ばれるプロトコルで実現されていた機能である。ChromecastやAndroid　TV(Google TV）ではGoogle Castという技術で同じような機能と実現している

Castのフレームワークを利用すると「電源オフ（スタンバイ）状態のAndroid TVのアプリをリモート起動する」ことを簡単に実現できそうなので試してみる

https://developers.google.com/cast/docs/overview

# 結論
Google Castを利用して電源オフ(スタンバイ）状態のAndroid TVのウェブブラウザをリモート起動した
Castを受け取ったサンプルアプリからstartActivity()でウェブブラウザを起動することで実現している

# 今後調査が必要なこと
- Castのセッションを継続したままSenderアプリからReceiverアプリへのメッセージの受け渡し可能か？
- Senderアプリ内で自動でキャスト先を選択することが可能か？

## Webアプリ用SDKではキャスト選択を手動で行う必要がある
Sender側でキャスト先を選択するコードがWeb Sender用のSDKではブラックボックスになっており、キャストアイコンから手動でキャスト先を選択する必要がある。プログラムで自動でキャスト先を決めて実行するためにはブラックボックスの中を調査する必要がありそうだ。

### iOS用SDKではキャスト選択部分のAPIが存在する
iOSの場合にはキャスト先選択UIの作成がアプリ開発者に委ねられている。同じようにWebアプリでもプログラムで処理することは可能だろう。

https://developers.google.com/cast/codelabs/cast-videos-ios#4


# 検証

## 検証に利用した環境
| 役割 | デバイス | アプリ |　補足|
|:-----------|:------------|:------------|:------------|
| Cast Sender| M1 MacBook Pro |[CastVideos-chrome](https://github.com/googlecast/CastVideos-chrome)|  Chromeで動作する Web Receiver アプリ　|
| Cast Receiver|ADT-3(Android TV)|[CastAndroidTvReceiver](https://github.com/googlecast/CastAndroidTvReceiver)| Android TV Receiver アプリ　|


## デバイスの登録
Castアプリ開発を始めるために[登録料$5が必要](https://developers.google.com/cast/codelabs/cast-connect-atv#2)になる
- 開発デバイスの登録 
    - Google Playに公開していないアプリを実行可能にする
- アプリの登録 
    - ApplicationIdを登録することでアプリをID指定してCastできる

今回利用するサンプルのReceiverアプリ[CastAndroidTvReceiver](https://github.com/googlecast/CastAndroidTvReceiver)のApplicationIdは公開登録されている。
今回の検証では利用する開発デバイスを登録するだけで良い。

:::note info
開発デバイスの登録処理には数分掛かる
:::

## サンプルアプリを動かす

### Cast Sender 
動画を送る側のアプリはChromeブラウザ上で動作するWebアプリ [CastVideos-chrome](https://github.com/googlecast/CastVideos-chrome) を利用する
下記サイトを参考にChromeでSenderアプリを実行する

https://developers.google.com/cast/codelabs/cast-videos-chrome#2


### Cast Receiver
キャストされた動画を再生するサンプルアプリは [CastAndroidTvReceiver](https://github.com/googlecast/CastAndroidTvReceiver) を利用した。Android TVで動作する
下記サイトを参考にAndroid Studioでコンパイルして実行する

https://developers.google.com/cast/codelabs/cast-connect-atv#3

### サンプルアプリでできること
Chromeブラウザ上で動作しているCastVideos-chrome側で再生していた動画をCastAndroidTvReceiverをインストールしたAndroid TV上へキャストして再生することができた。

## Cast Receiverの改造
Cast Receiver側でキャストのリクエストを受け付けた時に動画再生する代わりにブラウザを起動させる。
動画再生は失敗したことにしてSender側に通知する

修正箇所は下記ファイルの一箇所

```
app-java/src/main/java/com/google/sample/cast/atvreceiver/ui/PlaybackVideoFragment.java
```

https://github.com/aRaikoFunakami/CastAndroidTvReceiver/commit/6c66a111c147c50fda9cd6f7a3a0ac65e1da1b91


### 改造した Cast Receiver でブラウザの起動
キャスト可能なデバイスを見つけた際にはCastVideos-chromeで再生している動画のコントロール部分にキャストアイコンが表示される。そのキャストアイコンからADT-3デバイス(Android TV)を選択してキャストしている。キャスト要求をAndroid TV上のCastAndroidTvReceiverを処理するタイミングでブラウザを起動した。

<iframe width="560" height="315" src="https://www.youtube.com/embed/6aNVTIKL_lU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


# 参考サイト

## Google Cast SDK

https://developers.google.com/cast

## Google Castサンプルアプリ

https://developers.google.com/cast/codelabs/

## Google Castアプリ開発者登録とアプリ登録

https://www.itcowork.co.jp/blog/?p=5333#outline__3

https://www.itcowork.co.jp/blog/?p=5487