最近Android TVアプリの開発で困ったこと

雑にメモ

Android TVを正確に判定するのが難しい

Android DevelopersのAndroid TV実装ガイドにはTV端末をチェックするという項目があり、 UI_MODE_TYPE_TELEVISIONで判定すればいいよと書いてある。 しかし実際にはUI_MODE_TYPE_TELEVISIONなのにAndroid TVではない端末いくつかあり、自称AndroidTV端末としてチェックをすり抜けてしまう。 特にOSが4.x系でUI_MODE_TYPE_TELEVISIONな端末が曲者で、Android TVだけを想定してコードを書いていると4.x系では存在しないAPIにアクセスしてクラッシュすることがあって非常に辛い。 手元にないので試せていないが、おそらくHDMIスティック系の端末にも自称TV端末があるのではなかろうか。 TV判定のロジックにAPIレベルのチェックを追加するか、TV向けの部分であってもminSdkVersionで動くようにしておいたほうが良さそう。

結局、Android TVってUI_MODE_TYPE_TELEVISIONができたAPI level 13からサポート対象なのか、leanbackライブラリのv17からサポート対象なのか、Android TVそのものができたLollipopからサポート対象なのかよくわからない。

音声検索のマイク権限は外せる

AndroidTVで検索画面を実装する場合、通常はleanbackライブラリのSearchFragment/SearchSupportFragmentを利用する。 このクラスは普通に実装するとRECORD_AUDIO権限が必要だが、SpeechRecognitionCallbackを設定して音声検索をACTION_RECOGNIZE_SPEECHに任せれば権限不要となる。 Android Developers Blogにも書いてあったので多分間違いない。

TVでRuntime permissionsに対応するのはしんどいので、どんどん権限を外していきたい。

Leanbackライブラリの更新で死ぬ

leanback-v17ライブラリを23系にあげたときに、HorizontalGridViewlayout_heightwrap_contentにしているとjava.lang.IllegalStateException: Must specify rowHeight or view heightみたいなエラーを吐いてクラッシュする。 おそらくVerticalGridViewlayout_widthでも似たようなエラーが発生してクラッシュしそう。 メッセージの通り高さ/幅を指定すればクラッシュしなくなる。