Android TV Input Framework を触ってみる

# もくじ

- Android TV Input Framework ざっくり説明
- 公式の TV Input Service サンプルを動かす

# Android TV Input Framework ざっくり説明

## Android TV とは

Android TV とは、テレビに組み込まれることを想定した Android OS です。Android = スマートフォンのイメージが強いと意外な組み合わせに感じると思います。
Linux が組み込まれたテレビは少なくないこと、Android が組み込み Linux の代替で生まれた経緯を思い出せば、Android TV が生まれることは必然的だったかもしれません。

詳細は公式サイトを参照してください。https://www.android.com/intl/ja_jp/tv/
スマートフォンの Android 同様、Android TV 向きの Android アプリの開発もできます。

## Android TV Input Framework

「番組を受信する」「番組を選択して再生する」という機能が無いと誰もテレビと認識しないと思います。
これらの機能を開発しやすく構築されたアーキテクチャが Android TV に用意されていて、それが
[Android TV Input Framework (TIF)](https://source.android.com/devices/tv#components) です。

TIFを使ったアプリは、主に以下の2種類に分別されます。

- 番組を受信するアプリ (TV Input Service(TIS))
  - 例：androidtv-sample-inputs
- 番組を選局するアプリ
  - 例：[LiveTV](https://play.google.com/store/apps/details?id=com.google.android.tv&hl=ja)

以下では、[androidtv-sample-inputs](https://github.com/googlesamples/androidtv-sample-inputs) をエミュレータ上で動かしてみます。

# 公式の TV Input Service サンプルを動かす

ダウンロードしてビルドしてインストールするだけのはずですが、ハマりポイントが多いので、手順を紹介しています。

## 環境

- Ubuntu 19.10
- Android Studio 3.5.2
- Android TV API **27** (x86 Emulator)

 (API 28 はLiveTVの挙動がおかしいです…)

## androidtv-sample-inputs を取得してビルドする

GitHub にあるので、`git clone` します。

```
git clone https://github.com/googlesamples/androidtv-sample-inputs.git
```

取得できたら、Android Studio で repository を開き、Gradle Sync[^gradle_sync] します。

[^gradle_sync]: メニューバー → File → Sync project with gradle files

Make Project をクリックすればビルド出来る、と思ったのですが。
2019/11/13 時点では、以下のようなビルドエラーが発生します。

```
More than one file was found with OS independent path 'error_prone/Annotations.gwt.xml'
```

`Gradle Scripts / build.gradle (Module: app)` に以下の変更を加えて解決。

```diff
diff --git a/app/build.gradle b/app/build.gradle
index 4651b79..f380054 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -18,6 +18,13 @@ android {
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
         }
     }
+
+    packagingOptions {
+        exclude 'error_prone/Annotations.gwt.xml'
+        exclude 'third_party/java_src/error_prone/project/annotations/Annotations.gwt.xml'
+        exclude 'third_party/java_src/error_prone/project/annotations/Google_internal.gwt.xml'
+        exclude 'jsr305_annotations/Jsr305_annotations.gwt.xml'
+    }
 }
 
 ext {
```

## エミュレータ上で実行する。

通常の Android アプリ開発と同様、Run App で実行できます。
実行してみると、 readme.md のページが WebView で表示されるだけで、初見ではナニコレ？という気持ちになります。。
が、 Activity は、 TV Input Service の実装とは関係ありませんので、閉じてください。

ホーム画面からアプリ一覧を開きます。
androidtv-sample-inputs インストール前には無かった、LiveTV が出現しているはずです。

![Screenshot_1576682490.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502849/e0c8f40a-f2d6-6b43-420d-7f343466aa0c.png)

もし表示されていない場合、LiveTVを以下の手順で再起動させます。

- Settings -> Apps -> See All apps -> Live TV
- Disable を選択後 Enable を選択。
- Open を選択して開く。

Android TV Emulator 構成直後に Live TV が存在しないのは、以下の仕様によるものだそうです。
(https://github.com/googlesamples/androidtv-sample-inputs から)

> Note that the Live Channels app does not show up in Apps on Home screen unless there is at least one TV input service or a physical input like HDMI1.

LiveTV のウィザード画面に沿って設定を進めると、テレビのような画面が表示できるようになります。

![Screenshot_1576682467.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502849/75d0eece-9d9d-8653-2764-6697bbf89030.png)




# おわりに

Android TV Emulator を TV として使うにも手間がかかるんですね…

以上、[株式会社ACCESS Advent Calendar](https://qiita.com/advent-calendar/2019/access) 19日目でした。
まだあと6日ありますよ！