はじめようAndroidTV


[AndroidTV](https://www.android.com/tv/)をご存知でしょうか。
Googleによって開発されたテレビ用のAndroidプラットフォームで、発表されてからおよそ2年経ちます。しかし、あまり開発者目線の情報がありません。

情報が少ないと実践してみようと思う心意気まで失われかねないので、ここでは私が開発を始めた際の手順や注意点などを書きます。

私はまだAndroidTV開発者として初学者なためもっと知見を吸いたいですし、Google社もTV関連の機能拡充(後述)を進めていますし、なにより いちAndroidTVユーザーとしてこれからもっとTVアプリが充実して欲しいと思うので、はじめようAndroidTV！

![img](https://www.android.com/static/img/tv/lessbrowsing.jpg)

[公式のスタートガイドはこちらです](http://developer.android.com/intl/ja/training/tv/index.html
)が、少々ハマったので、この記事が少しでも誰かの助力になれば幸いです。

# AndroidTVとは

AndroidTVとはどういうものなのか...はここでは記載しません。
 @hotchemi さんの[Android TV入門](http://qiita.com/hotchemi/items/7e929fb8bbdab64caff7)が詳しいのでこちらをご一読ください。
また、[DroidKaiti2016にあったセッション](https://droidkaigi.github.io/2016/timetable.html#session-2016-02-18-11-30-12-00-c)でも非常に詳しく語られているので御覧ください。

# AndroidTV開発の準備

## AndroidTVデバイス
開発するにあたってAndroidTVのデバイスが必要になりますが、種類は大きく分けて3つあります。

### 1. 既存のTVに接続できるAndroidTVデバイス
[Nexus Player](http://www.google.co.jp/intl/ja_jp/nexus/player/)などがそうです。これに加えて映像を出力するためにHDMI入力端子を備えたテレビが必要になります。
ただのディスプレイに接続しても使えますが、スピーカー付きのものでないと音が出ないのでご注意ください。

### 2. AndroidTV搭載済みのテレビデバイス
[SONY BRAVIA](http://www.sony.jp/bravia/tokucho/androidtv.html)などがそうです。
こちらは私は触ったことないのでここでは特に触れません。すみません。
基本的に同じ構造なはずですが、Androidなもんで機種依存とかあるかもしれません。

### 3. エミュレータ
手軽に始めてみたいときはエミュレータが一番です。しかしスマホのAndroidエミュレータと同様に重いため、長期的な開発にはあまりおすすめできません。本格的に始める際はデバイスの購入を検討しましょう！

* (Nexus Playerは1万くらいで買えます！)
* (AndroidStudio2.xのエミュレータは試していません)
* (GenyMotionではTVのものはなかったです)

## AndroidTV開発に必要なもの

### 必ず必要なもの
* 開発用PC
* Android Studio
* AndroidTVデバイス
* wifi環境
* Android開発の基礎知識

まだスマホのAndroid開発をしたことがない方は先にやって基礎知識を積んでおいたほうが良いです。
また、AndroidTVはWearと違ってペアリングしないため、Handheld端末は不要です。

### あると便利なもの
* `adb shell input text`のコマンド術
* `adb shell input text`で日本語入力できる[ADBKeyBoard](https://github.com/senzhk/ADBKeyBoard)

AndroidTVでは基本的にローマ字入力をリモコンでちまちま打つかマイクで音声入力するしかないので、開発にあたって上記2つを取り入れると爆速コーディングが可能です。

ADBKeyBoardの[紹介記事はこちら](http://qiita.com/yuki-nakamura/items/4bd0ea7524521e731335)


### My開発環境
私の開発環境はこんな感じです。

* MacBook Pro (El capitan)
* Android Studio (v1.5.1)
* Nexu Player (6.0.1)
 * Panasonic製TV(別売り)
 * HDMI-HDMIケーブル(別売り)
 * USB-microUSBケーブル(別売り)

この通り私はNexus Playerを使っているので、これ以降の説明は全てAndroidTV ≒ Nexus Playerという体でのお話になります。ご了承ください。

## セットアップ
Nexus Playerでのセットアップ方法です。
エミュレータでやる方は飛ばして大丈夫です！

### まずは起動！
1. 端末の各ケーブルを接続。テレビ側は入力切替が必要です
1. OSが起動したらwifi接続
1. Googleアカウントでログイン(やり方は大体言われたとおりにやればOK)
1. 起動後、設定→端末情報→システムアップデート　からOSバージョンを確認し、アップデートがあればやっておきましょう。 (私は最初5.0で、6.0.1になるまで8回再起動して4時間かかりました。ご参考まで)

### つなげようadb (1)
USBケーブルを使ってadb接続する方法です。だいたいスマホと同じです。

1. まず手元のPCでadbのパスが通ってるか確認。ダメならググりましょう
1. AndroidTVの設定→端末情報から「ビルド」を連打してデベロッパーになりましょう(バージョン連打した時のイースターエッグもあるよ)
1. 設定→開発者向けオプション→デバッグからUSBデバッグをON
1. USBケーブルをPCと接続し、`$ adb devices`で認識できていることを確認
1. 認識できない場合は後述のトラブルシューティングを御覧ください

### つなげようadb (2)

TVは大体PCと離れたところにある気がするので、USBケーブルを使うと移動が大変です。そんなときはネットワーク接続しましょう。
スマホでも同様のことができますが、TVでやる場合はメリットが大きいですね。

1. 上記の(1)をやる
1. USBケーブルを繋いだ状態で次のコマンドを打つ
1. `$ adb tcpip 5555`
1. (これは最初の一回だけ打てばOKですが、IPが変わると毎回打つ必要があります)
1. 設定→ネットワーク　から、繋がってるwifiのアクセスポイント名を押下する
1. 「ステータス情報」からIPアドレスを確認する
1. 確認したIPアドレスを元に、次のコマンドを打つ(xxは適宜置き換え)
1. `$ adb connect 192.168.xx.xx`
1. USBケーブルを抜き、`$ adb devices`で認識できていることを確認
1. うまくいかない時はadbを再起動してみる
1. 接続を切りたいときは`$ adb disconnect 192.168.xx.xx`

※ USBケーブルを使わないでやる方法もあるらしいですが、私はうまくいきませんでした
※ 私の環境ではよくIPが変わるので結局長めのUSBケーブル買ってよしなにしてます

# Hello, TV World

ここまできたら、とりあえずAndroid Studioからサンプルプロジェクトを作ってビルドしてみましょう

1. Android StudioのNew Projectから、"Select the from factors"でTVのみを選択し、あとは言われるがまま。
1. ▶で実行して、いじいじしてみましょう。

### サンプルプロジェクトの注意点
* 標準でGlideが使われるのが興味深いですね。[Googleの公式じゃないって言ってます](https://github.com/bumptech/glide#disclaimer)けど。
* 使われてないリソースがちょいちょいあります
* 結構Lintに怒られてます
* `public class PlaybackOverlayFragment extends android.support.v17.leanback.app.PlaybackOverlayFragment`というネーミング...

このへんはあまり気にせず、淡々と読み進めましょう。きっと今後のアップデートで改善されます。

### 既存のアプリにTV対応する
既存のアプリにTV対応するときは、上記サンプルに加えこちらを読んでおくと理解が深まります。
[[Android] テレビアプリ開発入門 | Programming Style ](http://www.programing-style.com/android/android-lesson/android-tvapp-start/)

新しくmoduleを追加し、そこにプロジェクトを作って別apkを作るやり方です。
Android StudioのNew Projectから、"Select the from factors"で"TV"と"Phone"を選択してプロジェクトを作ると、どんな構成になるのかわかります。
moduleを分けず、スマホとTVを1apkで管理することも可能ですが、構成が煩雑になるためおすすめできません。
詳しくはドキュメントで。

## Leanback
サンプルプロジェクトを見るとわかりますが、AndroidTVでは[Leanback](https://developer.android.com/intl/ja/reference/android/support/v17/leanback/package-summary.html)というサポートライブラリが使われています。
Leanbackを使ってないアプリもありますが、Leanbackに沿ってアプリを作るとTVのデザインガイドラインに準拠したものが作れます。

### Leanbackの構成に慣れる
とりあえずLeanbackについてはの解説は公式に任せるとして、Leanbackのプロジェクト構成に慣れるためにはサンプルプロジェクトをよく読みいじいじしてみるのが良いでしょう。Leanbackではどんなものが標準で用意されているのか、継承関係を見て理解しておきましょう。

RecyclerViewに対して[Presenter](http://developer.android.com/intl/ja/reference/android/support/v17/leanback/widget/Presenter.html)が用意されたMVP構成になっており、Googleの設計思想が垣間見えます。

### Leanbackの構成に慣れたら
Leanbackに慣れたら、[GoogleがGitHubで公開しているサンプル](https://github.com/googlesamples?query=androidtv)を触って、あ〜こんなことできるんだーという思いに浸りましょう。更新頻度の高い[androidtv-Leanback](https://github.com/googlesamples/androidtv-Leanback)がおすすめです。

Leanbackの日本語記事ですと @Yuki_312 さんの記事が詳しいのでこちらをご確認ください。

* [AndroidTV Get Started](http://qiita.com/Yuki_312/items/1747da8fd451073ace76)
* [AndroidTV:ObjectAdapter, Presenter](http://qiita.com/Yuki_312/items/2080cd05a3b45a4110fb)
* [AndroidTV:Row, RowPresenter](http://qiita.com/Yuki_312/items/e985f3bad2155d693da5)
* [AndroidTV:ListRow, ListRowPresenter](http://qiita.com/Yuki_312/items/f10f2942a6d42880b6d3)

最新の情報は公式ドキュメントで確認しましょう。

## ふつうのAndroidとの違い
ここで言う「ふつうのAndroid」とはスマホのAndroidのことを指します。
AndroidTVも根本はAndroidなので基本的にはふつうのAndroidと同じなのですが、実は色々と違う部分があるので思いつくだけ列挙します。

### ブラウザはないよ！

ありません。したがって

```java
String url = "https://google.com";
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
```

ブラウザを呼び出すこんな処理を書いても、実行できるアプリがないという悲しいトーストが出ます。
よくよく考えるとAndroidTVの十字キーリモコンでブラウジングって結構しんどそうですね。TV用に最適化されたChrome for TVとかあっても良い気はするんですけど…。

ちなみにYoutubeは標準で入っているので

```java
String url = "https://youtube.com";
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
```
こういうことするとちゃんとYoutubeアプリが起動します。

### フォーカスが命だよ！
[banner.pngとLEANBACK_LAUNCHERさえ導入すれば](http://developer.android.com/intl/ja/training/tv/start/start.html)、既存アプリでもAndroidTVに「一応」対応できます。
しかし、リモコンの十字キーで操作すると、どこにフォーカスがあってどこで何を押すとどういう動きをするのかわからんことがわかります。そう考えるとLeanbackはTV向けによく洗練されているなぁと感じます。
デザインガイドラインをよく読み、[フォーカスナビゲーション](https://developer.android.com/intl/ja/training/tv/start/navigation.html)の実装についてもよく知っておきましょう。Leanbackを使わないことを選択するとなるとこの辺りで苦労すると思います。

### minSdkVersion 21だよ！
AndroidTVのOSバージョンは最低でもLolipopなので、スマホでは到底できない`minSdkVersion 21`ができます。新しいAPI使い放題です。夢のようですね。最高でしょ。

### 審査されるよ！
やりたい放題なスマホの方と違ってTVではGooglePlay公開前に審査が入ります。
繰り返しますが必ずガイドラインやドキュメントをよく読み、TVに最適化されたアプリを作るようにしましょう！

### 通知はないよ！
スマホにあるような、上からぽいっと出てくる通知機能はTVにはありません。代わりに[レコメンデーション](https://developer.android.com/intl/ja/training/tv/discovery/recommendations.html)という機能があり、別途設定をする必要があります。

### スマホ特有のハードウェア機能とかはないよ！
カメラや電話や指紋認証やジャイロセンサーなど、スマホでは当たり前でも「まぁテレビには必要ないだろうな」って直感的に思うハードウェア機能は大体無いです。あ、GPSはあります。

### 音量の設定はテレビ側のリモコンで！
音量の設定はテレビ側のリモコンでやる必要があります。ユーザーとしても結構不便なんですよねこれ。Nexus Playerのリモコンに付いてくれると嬉しいんですけど、テレビ側の規格に合わせるのが難しいんでしょうか…
このへん、AndroidTV搭載のテレビだとどうなってるのか気になります。

### Recent Appsボタンはないよ！
「最近使ったアプリ一覧」が表示されるあのボタンはNexus Playerのリモコンにはありませんし、AndroidTVの機能としてもありません。したがってタスクを終了させたいときは、再インストールするか、設定→アプリのアプリ一覧から選択して「強制停止」をするしかありません。(私の知る限り)
いい方法ないですかね…

### 戻るボタンはあるよ！
あります！リモコンに付いており、スマホ同様`onBackPressed()`が呼ばれます。ここは同じです。安心してください。
エミュレータの場合は[esc]が戻るボタンです。

# トラブルシューティング

私が開発をすすめる上でハマった点と解決法を書いておきます。

### USB経由でADB接続できない！

以下の流れを試してみましょう。

1. ケーブルが刺さってるか再確認(結構ゆるい)
2. USBデバッグがONになってるか確認
3. OFF→ONにして1分ほど待ってみる
4. ダメならOFF→ONにして5秒くらい待つのを繰り返す
5. ↑を1〜10回くらい繰り返す！(貴重な知見)
6. それでもダメなら端末再起動

Nexus Playerの場合は電源ケーブルの抜き差しで再起動できます。

### 画像やアイコンがぼやける！
Nexus Playerはデフォルトで`xhpi`のディレクトリを見にいっています。
`drawable-television`(または`mipmap-television`)のディレクトリを追加し、そこに`xxxhdpi`相当のサイズのものを入れてあげましょう。
(この辺ドキュメントが見当たらなかった…)

### 設定のアプリ一覧のアイコンの変更が反映されない！
設定のアプリ一覧のアイコンはOS側でキャッシュに持ってるっぽい(6.0.1時点)ので、たとえアプリを再インストールしてもアイコンが変わりません。端末を再起動すると反映されます。
つまり、アプリアイコンを変更してもユーザーが気づくのはいつになるか分からない、といえるので注意が必要です。
(エミュレータでもなるので仕様でなくバグな気がするんですが、どこにissue立てればいいんだろう…)

これは「設定のアプリ一覧のアプリアイコン」の話で、AndroidTV用のランチャーアイコンである「バナー画像」はちゃんと変わってくれます。

### DeployGateで配布したい！
[AndroidTVに対応しています。](https://deploygate.uservoice.com/knowledgebase/articles/397468
)ありがとうございます！

AndroidTVのGooglePlayには対応しておらず、手動で入れなければならないので、最初だけ手間がかかります。
PCで上記リンクからapkをダウンロードし、`$ adb install deploygate.apk`でインストールしましょう。
UIはモバイル版と同じです。

# Let's Start !!!!!

Android開発業界では、WearはQiita記事が充実してたり書籍が出てたりしていて結構盛り上がってる用に見えますが、TVはさっぱりな印象です。

AndroidTVは[サンプル](https://github.com/googlesamples/androidtv-Leanback)や[Support Libraryのアップデート](http://developer.android.com/intl/ja/tools/support-library/index.html#revisions)や[Android N](http://developer.android.com/intl/ja/preview/api-overview.html)でも積極的に開発が進んでいるので、Google社的にかなり気合が入っているような気がします！
Nで追加される[Android TV recording](http://developer.android.com/intl/ja/preview/api-overview.html#android_tv_recording
)とか[Picture-in-picture for Android TV](http://developer.android.com/intl/ja/preview/features/picture-in-picture.html
)とか最高に熱くないですか！未来を感じないですか！！

アプリ開発者よ集え！！AndroidTVに適応せよ！！
今すぐはじめようAndroidTV！溢れ出ろ知見！！(ここが重要)

# 参考
あれ読めこれ読めってたくさん言ってしまってすみません。
最低限必要なリンクを以下にまとめました。本格的に開発を始めるときは目を通しておきましょう。

* [Android TV | アンドロイドで、映画、スポーツ、ドラマを](https://www.android.com/tv/)
* [About Android TV](https://developer.android.com/intl/ja/tv/index.html)
* [Android TV アプリ開発](https://developer.android.com/intl/ja/training/tv/start/index.html)
* [Building Apps for TV](https://developer.android.com/intl/ja/training/tv/index.html)
* [Android TV への配布](https://developer.android.com/intl/ja/distribute/googleplay/tv.html)
* [TV App Quality](https://developer.android.com/intl/ja/distribute/essentials/quality/tv.html)
* [android.support.v17.leanback](https://developer.android.com/intl/ja/reference/android/support/v17/leanback/package-summary.html)
* [Designing for Android TV](https://developer.android.com/intl/ja/design/tv/index.html)
* [Android TV design guidelines](http://www.google.com/design/spec-tv/android-tv/introduction.html)

* [Android TV - Wikipedia](https://en.wikipedia.org/wiki/Android_TV)
> Not to be confused with Google TV.

私からは以上です。